diff --git a/.project b/.project
new file mode 100644
index 0000000..8674dd7
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.statemachine.aggregator</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/epl-v10.html b/epl-v10.html
new file mode 100644
index 0000000..b398acc
--- /dev/null
+++ b/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/jenkins.build.config.xml b/jenkins.build.config.xml
new file mode 100644
index 0000000..2ef6db2
--- /dev/null
+++ b/jenkins.build.config.xml
@@ -0,0 +1,36 @@
+<?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:                                                          -->
+<!--# 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.abstractstatemachine</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.ecview.core</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.eventbroker</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.fork.mihalis.opal.imageSelector.osgi</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.osgi.hybrid.api</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.persistence</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.preferences</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.runtime</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.runtime.web</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.ui.api</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.utils</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.addons</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.basic</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.datainterchange</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.functionlibrary</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.i18n</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.report</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.statemachine.feature/.project b/org.eclipse.osbp.xtext.statemachine.feature/.project
new file mode 100644
index 0000000..c8135b2
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.feature/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.statemachine.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.sonarlint.eclipse.core.sonarlintBuilder</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.statemachine.feature/LICENSE.txt b/org.eclipse.osbp.xtext.statemachine.feature/LICENSE.txt
new file mode 100644
index 0000000..ff42ad4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.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.statemachine.feature/build.properties b/org.eclipse.osbp.xtext.statemachine.feature/build.properties
new file mode 100644
index 0000000..0ea4044
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.feature/build.properties
@@ -0,0 +1,10 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               notice.html,\
+               license.html,\
+               LICENSE.txt,\
+               epl-v10.html
+src.includes = license.html,\
+               LICENSE.txt,\
+               notice.html,\
+               epl-v10.html			   
diff --git a/org.eclipse.osbp.xtext.statemachine.feature/epl-v10.html b/org.eclipse.osbp.xtext.statemachine.feature/epl-v10.html
new file mode 100644
index 0000000..b398acc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.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.statemachine.feature/feature.properties b/org.eclipse.osbp.xtext.statemachine.feature/feature.properties
new file mode 100644
index 0000000..937c8f0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.feature/feature.properties
@@ -0,0 +1,172 @@
+#=======================================================================
+# 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:
+# Loetz GmbH&Co.KG - 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 xtext.statemachine 
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse OSBP
+
+# "description" property - description of the feature
+description=This feature provides the OSBP xtext.statemachine bundle.
+
+# "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\
+Contributors:\n\
+    Loetz GmbH&amp;Co.KG - initial API and basis\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.statemachine.feature/feature.xml b/org.eclipse.osbp.xtext.statemachine.feature/feature.xml
new file mode 100644
index 0000000..fcb3aee
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.feature/feature.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+        id="org.eclipse.osbp.xtext.statemachine.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.statemachine"
+        download-size="0"
+        install-size="0"
+        version="0.0.0"
+        unpack="false"/>
+        
+    <plugin
+        id="org.eclipse.osbp.xtext.statemachine.ui"
+        download-size="0"
+        install-size="0"
+        version="0.0.0"
+        unpack="false"/>
+        
+        
+</feature>
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.statemachine.feature/license.html b/org.eclipse.osbp.xtext.statemachine.feature/license.html
new file mode 100644
index 0000000..6e579a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.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.statemachine.feature/notice.html b/org.eclipse.osbp.xtext.statemachine.feature/notice.html
new file mode 100644
index 0000000..c3d34c3
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.feature/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.statemachine.feature/pom.xml b/org.eclipse.osbp.xtext.statemachine.feature/pom.xml
new file mode 100644
index 0000000..a0c69fc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.feature/pom.xml
@@ -0,0 +1,89 @@
+<?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:
+# 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/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.eclipse.osbp.xtext.statemachine</groupId>
+        <artifactId>org.eclipse.osbp.xtext.statemachine.aggregator</artifactId>
+        <version>0.9.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>org.eclipse.osbp.xtext.statemachine.feature</artifactId>
+    <packaging>eclipse-feature</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.eclipse.tycho.extras</groupId>
+                <artifactId>tycho-source-feature-plugin</artifactId>
+                <version>${tychoExtrasVersion}</version>
+                <executions>
+                    <execution>
+                        <id>source-feature</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>source-feature</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <labelSuffix> (source)</labelSuffix>
+                </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>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.osbp.xtext.statemachine</groupId>
+            <artifactId>org.eclipse.osbp.xtext.statemachine</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.osbp.xtext.statemachine</groupId>
+            <artifactId>org.eclipse.osbp.xtext.statemachine.ui</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/org.eclipse.osbp.xtext.statemachine.feature/src/main/javadoc/README.txt b/org.eclipse.osbp.xtext.statemachine.feature/src/main/javadoc/README.txt
new file mode 100644
index 0000000..831da7e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.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.statemachine.feature/src/overview.html b/org.eclipse.osbp.xtext.statemachine.feature/src/overview.html
new file mode 100644
index 0000000..7bc7d2e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.feature/src/overview.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+	<title>OSBP xtext.statemachine</title>
+</head>
+<body>
+<p>The <strong>OSBP&nbsp;xtext.statemachine</strong> provides bundles for the OSBP xtext.statemachine functionality.</p>
+</body>
+</html>
diff --git a/org.eclipse.osbp.xtext.statemachine.tests/.project b/org.eclipse.osbp.xtext.statemachine.tests/.project
new file mode 100644
index 0000000..c987c3e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.tests/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.statemachine.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.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>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osbp.xtext.statemachine.tests/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.statemachine.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..aba4454
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osbp.xtext.statemachine.tests
+Bundle-Vendor: Eclipse OSBP
+Bundle-Version: 0.9.0.qualifier
+Bundle-SymbolicName: org.eclipse.osbp.xtext.statemachine.tests; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.osbp.xtext.statemachine,
+ org.eclipse.osbp.xtext.statemachine.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.xtext.junit4,
+ org.eclipse.ui.workbench;resolution:=optional,
+ org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional,
+ com.google.inject;bundle-version="3.0.0"
+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.statemachine
diff --git a/org.eclipse.osbp.xtext.statemachine.tests/build.properties b/org.eclipse.osbp.xtext.statemachine.tests/build.properties
new file mode 100644
index 0000000..c22eebe
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.tests/build.properties
@@ -0,0 +1,5 @@
+source.. = src/,\
+          src-gen/,\
+          xtend-gen/
+bin.includes = META-INF/,\
+       .
diff --git a/org.eclipse.osbp.xtext.statemachine.tests/org.eclipse.osbp.xtext.statemachine.tests.launch b/org.eclipse.osbp.xtext.statemachine.tests/org.eclipse.osbp.xtext.statemachine.tests.launch
new file mode 100644
index 0000000..ccbc54b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.tests/org.eclipse.osbp.xtext.statemachine.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.statemachine.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.statemachine.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.statemachine.tests"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+</launchConfiguration>
diff --git a/org.eclipse.osbp.xtext.statemachine.tests/pom.xml b/org.eclipse.osbp.xtext.statemachine.tests/pom.xml
new file mode 100644
index 0000000..1d71efd
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.tests/pom.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--#======================================================================= -->
+<!--# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) -->
+<!--# All rights reserved. This program and the accompanying materials -->
+<!--# are made available under the terms of the Eclipse Public License v1.0 -->
+<!--# which accompanies this distribution, and is available at -->
+<!--# http://www.eclipse.org/legal/epl-v10.html -->
+<!--# -->
+<!--# Contributors: -->
+<!--#     Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation -->
+<!--#======================================================================= -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.osbp.xtext.statemachine</groupId>
+		<artifactId>org.eclipse.osbp.xtext.statemachine.aggregator</artifactId>
+		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>..</relativePath>
+	</parent>
+	<artifactId>org.eclipse.osbp.xtext.statemachine.tests</artifactId>
+	<packaging>eclipse-plugin</packaging>
+
+</project>
diff --git a/org.eclipse.osbp.xtext.statemachine.tests/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLInjectorProvider.java b/org.eclipse.osbp.xtext.statemachine.tests/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLInjectorProvider.java
new file mode 100644
index 0000000..a373707
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.tests/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLInjectorProvider.java
@@ -0,0 +1,55 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine;
+
+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 StatemachineDSLInjectorProvider 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 StatemachineDSLStandaloneSetup().createInjectorAndDoEMFRegistration();
+	}
+
+	public void restoreRegistry() {
+		stateBeforeInjectorCreation.restoreGlobalState();
+	}
+
+	public void setupRegistry() {
+		getInjector();
+		stateAfterInjectorCreation.restoreGlobalState();
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.tests/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLUiInjectorProvider.java b/org.eclipse.osbp.xtext.statemachine.tests/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLUiInjectorProvider.java
new file mode 100644
index 0000000..6a412d0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.tests/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLUiInjectorProvider.java
@@ -0,0 +1,26 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine;
+
+import org.eclipse.xtext.junit4.IInjectorProvider;
+
+import com.google.inject.Injector;
+
+public class StatemachineDSLUiInjectorProvider implements IInjectorProvider {
+	
+	public Injector getInjector() {
+		return org.eclipse.osbp.xtext.statemachine.ui.internal.StatemachineDSLActivator.getInstance().getInjector("org.eclipse.osbp.xtext.statemachine.StatemachineDSL");
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/.project b/org.eclipse.osbp.xtext.statemachine.ui/.project
new file mode 100644
index 0000000..8eace26
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/.project
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.statemachine.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.statemachine.ui/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.statemachine.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cb81763
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,30 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osbp.xtext.statemachine.ui
+Bundle-Vendor: Eclipse OSBP
+Bundle-Version: 0.9.0.qualifier
+Bundle-SymbolicName: org.eclipse.osbp.xtext.statemachine.ui; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.osbp.xtext.statemachine;visibility:=reexport,
+ org.eclipse.xtext.ui,
+ org.eclipse.ui.editors;bundle-version="3.5.0",
+ org.eclipse.ui.ide;bundle-version="3.5.0",
+ org.eclipse.xtext.ui.shared,
+ org.eclipse.ui,
+ org.eclipse.xtext.builder,
+ org.eclipse.xtext.xbase.lib,
+ org.antlr.runtime,
+ org.eclipse.xtext.common.types.ui,
+ org.eclipse.xtext.ui.codetemplates.ui,
+ org.eclipse.compare,
+ org.eclipse.xtext.xbase.ui,
+ org.eclipse.jdt.debug.ui,
+ org.eclipse.osbp.fork.mihalis.opal.imageSelector.osgi;bundle-version="0.9.0",
+ org.eclipse.osbp.xtext.basic.ui;bundle-version="0.9.0"
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osbp.xtext.statemachine.ui.quickfix,
+ org.eclipse.osbp.xtext.statemachine.ui.contentassist,
+ org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr,
+ org.eclipse.osbp.xtext.statemachine.ui.internal
+Bundle-Activator: org.eclipse.osbp.xtext.statemachine.ui.internal.StatemachineDSLActivator
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/build.properties b/org.eclipse.osbp.xtext.statemachine.ui/build.properties
new file mode 100644
index 0000000..484d095
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/,\
+          src-gen/,\
+          xtend-gen/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               i18n/
+
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/i18n/I18N.properties b/org.eclipse.osbp.xtext.statemachine.ui/i18n/I18N.properties
new file mode 100644
index 0000000..b30d39c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/i18n/I18N.properties
@@ -0,0 +1,686 @@
+#
+#Mon Mar 20 13:51:29 CET 2017
+org.eclipse.osbp.xtext.statemachine.InternalType=
+org.eclipse.osbp.xtext.statemachine.InternalType.NONE=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.Boolean=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.Date=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.DateTime=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.Decimal=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.Float=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.Integer=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.Long=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.String=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.lang.Time=
+org.eclipse.osbp.xtext.statemachine.InternalType.java.util.List=
+org.eclipse.osbp.xtext.statemachine.QualifiedName=
+org.eclipse.osbp.xtext.statemachine.SINT=
+org.eclipse.osbp.xtext.statemachine.SignedNumber=
+org.eclipse.osbp.xtext.statemachine.Statemachine=
+org.eclipse.osbp.xtext.statemachine.Statemachine.actions=
+org.eclipse.osbp.xtext.statemachine.Statemachine.control-object=
+org.eclipse.osbp.xtext.statemachine.Statemachine.controls=
+org.eclipse.osbp.xtext.statemachine.Statemachine.described\ by=
+org.eclipse.osbp.xtext.statemachine.Statemachine.events=
+org.eclipse.osbp.xtext.statemachine.Statemachine.functiongroup=
+org.eclipse.osbp.xtext.statemachine.Statemachine.guards=
+org.eclipse.osbp.xtext.statemachine.Statemachine.initialEvent=
+org.eclipse.osbp.xtext.statemachine.Statemachine.initialState=
+org.eclipse.osbp.xtext.statemachine.Statemachine.statemachine=
+org.eclipse.osbp.xtext.statemachine.Statemachine.states=
+org.eclipse.osbp.xtext.statemachine.StatemachineAction=
+org.eclipse.osbp.xtext.statemachine.StatemachineAction.action=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButton=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButton.baction=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButton.caption=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButton.image=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption.caption=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage.image=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition.transition=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition.when=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTO=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTO.daction=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTO.find=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTO.in=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind.attribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind.find=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind.in=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind.search=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionField=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionField.faction=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionField.get=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionField.invisible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionField.set=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionField.visible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear.clear=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear.dummy=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet.get=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGetMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGetMore.get=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldInvisible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldInvisible.invisible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke.keystroke=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove.back=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove.remove=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet.as=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet.set=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDouble=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDoubleMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute.dto=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttributeMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttributeMore.dto=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate.evaluate=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluateMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent.event=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceInteger=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceInteger.integer=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceIntegerMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumberMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString.text=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceStringMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate.translate=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslateMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslateMore.translate=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldVisible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldVisible.visible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible.invisible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible.visible=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTResponse=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTResponse.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTResponse.paymentResponse=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTStatus=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTStatus.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTStatus.paymentStatus=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTTransaction=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTTransaction.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPTTransaction.paymentTransaction=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheral=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheral.paction=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate.blinkRate=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear.clear=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear.clearDevice=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow.column=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow.createWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow.height=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow.row=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow.width=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow.windowHeight=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow.windowWidth=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType.cursorType=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow.destroyWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness.deviceBrightness=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceCashDrawer=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceCashDrawer.openDrawer=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.blinkRate=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.clear=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.column=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.createWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.cursorType=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.destroyWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.deviceBrightness=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.displayBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.displayText=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.displayTextAt=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.height=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.id=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.interCharacterWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.marqueeFormat=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.marqueeRepeatWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.marqueeType=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.marqueeUnitWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.row=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.text=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.width=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.windowHeight=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceLineDisplay.windowWidth=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.barcodeType=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.data=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.id=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.name=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.printBarcode=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.printBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.printCut=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.printNormal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.registerBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDevicePOSPrinter.text=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap.displayBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap.id=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText.displayText=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText.text=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt.column=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt.displayTextAt=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt.row=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt.text=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait.interCharacterWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat.marqueeFormat=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait.marqueeRepeatWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType.marqueeType=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait.marqueeUnitWait=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer.openDrawer=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge.paymentAcknowledge=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization.amount=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization.ofAmount=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization.onSuccess=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization.paymentAuthorization=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTBalanceRequest=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTBalanceRequest.balanceRequest=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose.closePT=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose.closePaymentTerminal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose.paymentClose=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen.host=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen.openPT=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen.openPaymentTerminal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen.paymentOpen=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen.port=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTPrepaidTopUp=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTPrepaidTopUp.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTPrepaidTopUp.prepaidTopUp=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration.configuration=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration.onSuccess=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration.password=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration.paymentRegistration=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration.withPassword=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse.paymentResponse=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal.ofReceipt=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal.paymentReversal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal.receipt=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal.reversal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal.withPassword=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTStatus=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTStatus.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTStatus.paymentStatus=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTTransaction=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTTransaction.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTTransaction.paymentTransaction=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceBalanceRequest=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceBalanceRequest.balanceRequest=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceClose=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceClose.closePaymentDevice=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceOpen=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceOpen.openPaymentDevice=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDevicePayment=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDevicePayment.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDevicePayment.payment=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDevicePrepaidTopUp=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDevicePrepaidTopUp.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDevicePrepaidTopUp.prepaidTopUp=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceReversal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceReversal.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentDeviceReversal.reversal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalAuthorization=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalAuthorization.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalAuthorization.paymentAuthorization=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalBalanceRequest=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalBalanceRequest.balanceRequest=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalClose=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalClose.closePaymentTerminal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalOpen=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalOpen.host=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalOpen.openPaymentTerminal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalOpen.port=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalPayment=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalPayment.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalPayment.payment=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalPrepaidTopUp=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalPrepaidTopUp.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalPrepaidTopUp.prepaidTopUp=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalRegistration=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalRegistration.password=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalRegistration.paymentRegistration=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalReversal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalReversal.of=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPaymentTerminalReversal.reversal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode.barcodeType=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode.data=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode.printBarcode=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap.id=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap.printBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut.printCut=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut.text=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal.printNormal=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal.text=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap.id=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap.name=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap.registerBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport.filter=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport.printReport=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll.for=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll.scroll=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler.schedule=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionStateTransition=
+org.eclipse.osbp.xtext.statemachine.StatemachineActionStateTransition.transition=
+org.eclipse.osbp.xtext.statemachine.StatemachineAttributeBase=
+org.eclipse.osbp.xtext.statemachine.StatemachineButtonActionEnum=
+org.eclipse.osbp.xtext.statemachine.StatemachineButtonActionEnum.Caption=
+org.eclipse.osbp.xtext.statemachine.StatemachineButtonActionEnum.Image=
+org.eclipse.osbp.xtext.statemachine.StatemachineControl=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButton=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButton.event=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButton.keypad=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute.button=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute.image=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent.event=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity.id=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard.key=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType.identity=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType.keyboard=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType.trigger=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlClass=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlClass.Button=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlClass.Data=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlClass.Peripheral=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlClass.Scheduler=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO.dataProvider=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute.dto=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute.event=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlDevice=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlDevice.device=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlField=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlField.fields=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute.field=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute.primitive=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldElement=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout.layout=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObject=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObject.class=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObject.control=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectAttribute.attribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectAttribute.event=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectAttribute.image=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectAttribute.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectAttribute.type\==
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectDTOAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectDTOAttribute.dto=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectDTOAttribute.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectPrimitiveAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectPrimitiveAttribute.image=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectPrimitiveAttribute.primitive=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectPrimitiveAttribute.send=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectPrimitiveAttribute.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectSchedulerAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectSchedulerAttribute.delay=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectSchedulerAttribute.scheduler=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlObjectSchedulerAttribute.send=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral.peripheral=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlPrimitiveAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlPrimitiveAttribute.primitive=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlPrimitiveAttribute.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler.scheduler=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute.delay=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute.scheduler=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute.send=
+org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility=
+org.eclipse.osbp.xtext.statemachine.StatemachineDTOActionEnum=
+org.eclipse.osbp.xtext.statemachine.StatemachineDTOActionEnum.Find=
+org.eclipse.osbp.xtext.statemachine.StatemachineDTOType=
+org.eclipse.osbp.xtext.statemachine.StatemachineDtoType=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.IPAdress=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.browserLocale=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getBrowserLocale=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getIPAddress=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getNow=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getSceenWidth=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getScreenHeight=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getTrigger=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getUser=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getUserAgentInfo=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getUserEmail=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getUserName=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getUserPassword=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getUserPosition=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.getUserPrintService=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.ipAdress=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.isHTTPS=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.isHttps=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.isTouchDevice=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.now=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.printReport=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.sceenWidth=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.screenHeight=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.user=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType.userAgentInfo=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvent=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvent.event=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvent.guards=
+org.eclipse.osbp.xtext.statemachine.StatemachineEvent.send=
+org.eclipse.osbp.xtext.statemachine.StatemachineFieldActionEnum=
+org.eclipse.osbp.xtext.statemachine.StatemachineFieldActionEnum.Append=
+org.eclipse.osbp.xtext.statemachine.StatemachineFieldActionEnum.Clear=
+org.eclipse.osbp.xtext.statemachine.StatemachineFieldActionEnum.Enable=
+org.eclipse.osbp.xtext.statemachine.StatemachineFieldActionEnum.Get=
+org.eclipse.osbp.xtext.statemachine.StatemachineFieldActionEnum.Remove=
+org.eclipse.osbp.xtext.statemachine.StatemachineFieldActionEnum.Set=
+org.eclipse.osbp.xtext.statemachine.StatemachineFieldType=
+org.eclipse.osbp.xtext.statemachine.StatemachineFunction=
+org.eclipse.osbp.xtext.statemachine.StatemachineFunction.function=
+org.eclipse.osbp.xtext.statemachine.StatemachineGuard=
+org.eclipse.osbp.xtext.statemachine.StatemachineGuard.caption=
+org.eclipse.osbp.xtext.statemachine.StatemachineGuard.description=
+org.eclipse.osbp.xtext.statemachine.StatemachineGuard.guard=
+org.eclipse.osbp.xtext.statemachine.StatemachineGuard.onFail=
+org.eclipse.osbp.xtext.statemachine.StatemachineGuard.type=
+org.eclipse.osbp.xtext.statemachine.StatemachineImport=
+org.eclipse.osbp.xtext.statemachine.StatemachineImport.import=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.Boolean=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.Date=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.DateTime=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.Double=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.Integer=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.Long=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.NONE=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.String=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.SuggestText=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.YSuggestTextFieldEvents=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.Boolean=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.Date=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.DateTime=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.Decimal=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.Double=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.Float=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.Integer=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.Long=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.String=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.lang.Time=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.java.util.List=
+org.eclipse.osbp.xtext.statemachine.StatemachineInternalType.org.eclipse.osbp.ecview.core.extension.model.extension.YSuggestTextFieldEvents=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType.blink=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType.block=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType.fixed=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType.halfblock=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType.none=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType.other=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType.reverse=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType.underline=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat.place=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat.walk=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType.down=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType.init=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType.left=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType.none=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType.right=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType.up=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType.down=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType.left=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType.right=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType.up=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType.blink=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType.blink\ reverse=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType.blinkreverse=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType.normal=
+org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType.reverse=
+org.eclipse.osbp.xtext.statemachine.StatemachineModel=
+org.eclipse.osbp.xtext.statemachine.StatemachineObjectType=
+org.eclipse.osbp.xtext.statemachine.StatemachineOperation=
+org.eclipse.osbp.xtext.statemachine.StatemachineOperation.operation=
+org.eclipse.osbp.xtext.statemachine.StatemachineOperation.with=
+org.eclipse.osbp.xtext.statemachine.StatemachineOperationMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineOperationMore.operation=
+org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter=
+org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter.parameter=
+org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameterMore=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.aztec=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.code128=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.code128_parsed=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.code39=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.code93=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.codeabar=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.datamatrix=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.ean128=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.ean13=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.ean13_s=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.ean8=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.ean8_s=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.gs1databar=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.gs1databar_e=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.gs1databar_e_s=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.gs1databar_s=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.itf=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.jan13=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.jan8=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.maxicode=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.ocrb=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.orca=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.pdf417=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.qrcode=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.tf=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upca=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upca_s=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upcb=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upcd1=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upcd2=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upcd3=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upcd4=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upcd5=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.upce_s=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.updf417=
+org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType.uqrcode=
+org.eclipse.osbp.xtext.statemachine.StatemachinePackage=
+org.eclipse.osbp.xtext.statemachine.StatemachinePackage.package=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionBlinkRate=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionBlinkRate.blinkRate=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionClear=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionClear.clear=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCreateWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCreateWindow.column=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCreateWindow.createWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCreateWindow.height=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCreateWindow.row=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCreateWindow.width=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCreateWindow.windowHeight=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCreateWindow.windowWidth=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCursorType=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionCursorType.cursorType=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionDestroyWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionDestroyWindow.destroyWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.BlinkRate=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.ClearDisplay=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.CreateWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.CursorType=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.DestroyWindow=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.DeviceBrightness=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.DisplayBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.DisplayLine=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.DisplayTextAt=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.InterCharacterWait=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.MarqueeFormat=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.MarqueeRepeatWait=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.MarqueeType=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.MarqueeUnitWait=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.OpenDrawer=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.PrintBarcode=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.PrintBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.PrintCut=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.PrintNormal=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.RegisterBitmap=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralActionEnum.Scroll=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer.cashDrawer=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceEnum=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceEnum.CashDrawer=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceEnum.LineDisplay=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceEnum.PosPrinter=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay.lineDisplay=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter.posPrinter=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT.payment=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePayment=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePayment.payment=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePaymentTerminal=
+org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePaymentTerminal.payment=
+org.eclipse.osbp.xtext.statemachine.StatemachinePrimitiveType=
+org.eclipse.osbp.xtext.statemachine.StatemachineQualifiedNameWithWildCard=
+org.eclipse.osbp.xtext.statemachine.StatemachineSearchAttribute=
+org.eclipse.osbp.xtext.statemachine.StatemachineSimpleType=
+org.eclipse.osbp.xtext.statemachine.StatemachineState=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.actions=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.and=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.identities=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.identity=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.keystroke=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.keystrokes=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.operation=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.state=
+org.eclipse.osbp.xtext.statemachine.StatemachineState.triggers=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateCommon=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateCommon.actions=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateCommon.guards=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateCommon.triggers=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateElement=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateElement.actions=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateElement.guards=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateElement.triggers=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateOperation=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateOperation.operation=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateTransition=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateTransition.actions=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateTransition.guards=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateTransition.identities=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateTransition.keystrokes=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateTransition.operations=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateTransition.transition=
+org.eclipse.osbp.xtext.statemachine.StatemachineStateTransition.triggers=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorage=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorage.store=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorage.with=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageGet=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageGet.retrieve=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageGet.with=
+org.eclipse.osbp.xtext.statemachine.StatemachineStoragePut=
+org.eclipse.osbp.xtext.statemachine.StatemachineStoragePut.store=
+org.eclipse.osbp.xtext.statemachine.StatemachineStoragePut.with=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve.retrieve=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieveMore=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieveMore.from=
+org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieveMore.retrieve=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition.\=>=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition.action=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition.actions=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition.guard=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition.guards=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition.transition=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition.trigger=
+org.eclipse.osbp.xtext.statemachine.StatemachineTransition.triggers=
+org.eclipse.osbp.xtext.statemachine.StatemachineTrigger=
+org.eclipse.osbp.xtext.statemachine.StatemachineTrigger.actions=
+org.eclipse.osbp.xtext.statemachine.StatemachineTrigger.guards=
+org.eclipse.osbp.xtext.statemachine.StatemachineTrigger.transition=
+org.eclipse.osbp.xtext.statemachine.StatemachineTrigger.trigger=
+org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType=
+org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType.assistive=
+org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType.error=
+org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType.humanized=
+org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType.tray=
+org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType.warning=
+org.eclipse.osbp.xtext.statemachine.TRANSLATABLEID=
+org.eclipse.osbp.xtext.statemachine.TRANSLATABLESTRING=
+org.eclipse.osbp.xtext.statemachine.UnsignedNumber=
+org.eclipse.osbp.xtext.statemachine.ValidID=
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/icons/dsl_statemachine.png b/org.eclipse.osbp.xtext.statemachine.ui/icons/dsl_statemachine.png
new file mode 100644
index 0000000..d42151c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/icons/dsl_statemachine.png
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/plugin.xml b/org.eclipse.osbp.xtext.statemachine.ui/plugin.xml
new file mode 100644
index 0000000..3db4719
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/plugin.xml
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+
+    <extension
+            point="org.eclipse.ui.editors">
+        <editor
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+            default="true"
+            extensions="statemachine"
+            icon="icons/dsl_statemachine.png"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            name="StatemachineDSL Editor">
+        </editor>
+    </extension>
+    <extension
+        point="org.eclipse.ui.handlers">
+        <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+            commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+            <activeWhen>
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+        <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+            commandId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.validate">
+         <activeWhen>
+            <reference
+                    definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+            </reference>
+         </activeWhen>
+      	</handler>
+      	<!-- copy qualified name -->
+        <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+            <activeWhen>
+				<reference definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened" />
+            </activeWhen>
+        </handler>
+        <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+            <activeWhen>
+            	<and>
+            		<reference definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.Editor.opened">
+            <and>
+                <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+                <with variable="activeEditor">
+                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+                        value="org.eclipse.osbp.xtext.statemachine.StatemachineDSL" 
+                        forcePluginActivation="true"/>
+                </with>        
+            </and>
+        </definition>
+        <definition id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.XtextEditor.opened">
+            <and>
+                <reference definitionId="isXtextEditorActive"/>
+                <with variable="activeEditor">
+                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+                        value="org.eclipse.osbp.xtext.statemachine.StatemachineDSL" 
+                        forcePluginActivation="true"/>
+                </with>        
+            </and>
+        </definition>
+    </extension>
+    <extension
+            point="org.eclipse.ui.preferencePages">
+        <page
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            icon="icons/dsl_statemachine.png"
+            name="OSBP StatemachineDSL">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+        </page>
+        <page
+            category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.coloring"
+            name="Syntax Coloring">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+        </page>
+        <page
+            category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.templates"
+            icon="icons/dsl_statemachine.png"
+            name="Templates">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+        </page>
+    </extension>
+    <extension
+            point="org.eclipse.ui.propertyPages">
+        <page
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+            icon="icons/dsl_statemachine.png"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            name="OSBP StatemachineDSL">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+            <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.statemachine.ui.keyword_StatemachineDSL"
+            label="StatemachineDSL"/>
+    </extension>
+    <extension
+         point="org.eclipse.ui.commands">
+      <command
+            description="Trigger expensive validation"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.validate"
+                 style="push"
+                 tooltip="Trigger expensive validation">
+            <visibleWhen checkEnabled="false">
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.Editor.opened">
+                	</reference>
+            	</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+	    <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+            commandId="org.eclipse.xtext.ui.editor.FindReferences">
+            <activeWhen>
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+    </extension>   
+
+<!-- adding resource factories -->
+
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="statemachine">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+        <resourceServiceProvider
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+            uriExtension="statemachine">
+        </resourceServiceProvider>
+    </extension>
+
+
+	<!-- marker definitions for org.eclipse.osbp.xtext.statemachine.StatemachineDSL -->
+	<extension
+	        id="statemachinedsl.check.fast"
+	        name="StatemachineDSL Problem"
+	        point="org.eclipse.core.resources.markers">
+	    <super type="org.eclipse.xtext.ui.check.fast"/>
+	    <persistent value="true"/>
+	</extension>
+	<extension
+	        id="statemachinedsl.check.normal"
+	        name="StatemachineDSL Problem"
+	        point="org.eclipse.core.resources.markers">
+	    <super type="org.eclipse.xtext.ui.check.normal"/>
+	    <persistent value="true"/>
+	</extension>
+	<extension
+	        id="statemachinedsl.check.expensive"
+	        name="StatemachineDSL 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.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+            fileExtensions="statemachine"
+            >
+      </participant>
+   </extension>
+   <extension
+            point="org.eclipse.ui.preferencePages">
+        <page
+            category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.compiler.preferencePage"
+            icon="icons/dsl_statemachine.png"
+            name="Compiler">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+        </page>
+    </extension>
+    <extension
+            point="org.eclipse.ui.propertyPages">
+        <page
+            category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.compiler.propertyPage"
+            icon="icons/dsl_statemachine.png"
+            name="Compiler">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+            <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.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+    <!-- quickfix marker resolution generator for org.eclipse.osbp.xtext.statemachine.StatemachineDSL -->
+    <extension
+            point="org.eclipse.ui.ide.markerResolution">
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.statemachine.ui.statemachinedsl.check.fast">
+            <attribute
+                name="FIXABLE_KEY"
+                value="true">
+            </attribute>
+        </markerResolutionGenerator>
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.statemachine.ui.statemachinedsl.check.normal">
+            <attribute
+                name="FIXABLE_KEY"
+                value="true">
+            </attribute>
+        </markerResolutionGenerator>
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.statemachine.ui.statemachinedsl.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.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+			commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.Editor.opened">
+               </reference>
+            </visibleWhen>
+         </command>
+      </menuContribution>
+   </extension>
+   <extension point="org.eclipse.ui.preferencePages">
+	    <page
+	        category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+	        class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+	        id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.refactoring"
+            icon="icons/dsl_statemachine.png"
+	        name="Refactoring">
+	        <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+	    </page>
+	</extension>
+
+  <extension point="org.eclipse.compare.contentViewers">
+    <viewer id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.compare.contentViewers"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+            extensions="statemachine">
+    </viewer>
+  </extension>
+  <extension point="org.eclipse.compare.contentMergeViewers">
+    <viewer id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.compare.contentMergeViewers"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+            extensions="statemachine" label="StatemachineDSL Compare">
+     </viewer>
+  </extension>
+  <extension point="org.eclipse.ui.editors.documentProviders">
+    <provider id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.editors.documentProviders"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+            extensions="statemachine">
+    </provider>
+  </extension>
+
+</plugin>
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/plugin.xml_gen b/org.eclipse.osbp.xtext.statemachine.ui/plugin.xml_gen
new file mode 100644
index 0000000..8fe732c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/plugin.xml_gen
@@ -0,0 +1,562 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+
+    <extension
+            point="org.eclipse.ui.editors">
+        <editor
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+            default="true"
+            extensions="statemachine"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            matchingStrategy="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.editor.JavaEditorInputMatcher"
+            name="StatemachineDSL Editor">
+        </editor>
+    </extension>
+    <extension
+        point="org.eclipse.ui.handlers">
+        <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+            commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+            <activeWhen>
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+        <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+            commandId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.validate">
+         <activeWhen>
+            <reference
+                    definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+            </reference>
+         </activeWhen>
+      	</handler>
+      	<!-- copy qualified name -->
+        <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+            <activeWhen>
+				<reference definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened" />
+            </activeWhen>
+        </handler>
+        <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+            <activeWhen>
+            	<and>
+            		<reference definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.Editor.opened">
+            <and>
+                <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+                <with variable="activeEditor">
+                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+                        value="org.eclipse.osbp.xtext.statemachine.StatemachineDSL" 
+                        forcePluginActivation="true"/>
+                </with>        
+            </and>
+        </definition>
+        <definition id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.XtextEditor.opened">
+            <and>
+                <reference definitionId="isXtextEditorActive"/>
+                <with variable="activeEditor">
+                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+                        value="org.eclipse.osbp.xtext.statemachine.StatemachineDSL" 
+                        forcePluginActivation="true"/>
+                </with>        
+            </and>
+        </definition>
+    </extension>
+    <extension
+            point="org.eclipse.ui.preferencePages">
+        <page
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            name="StatemachineDSL">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+        </page>
+        <page
+            category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.coloring"
+            name="Syntax Coloring">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+        </page>
+        <page
+            category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.templates"
+            name="Templates">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+        </page>
+    </extension>
+    <extension
+            point="org.eclipse.ui.propertyPages">
+        <page
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            name="StatemachineDSL">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+            <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.statemachine.ui.keyword_StatemachineDSL"
+            label="StatemachineDSL"/>
+    </extension>
+    <extension
+         point="org.eclipse.ui.commands">
+      <command
+            description="Trigger expensive validation"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.validate"
+                 style="push"
+                 tooltip="Trigger expensive validation">
+            <visibleWhen checkEnabled="false">
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.Editor.opened">
+                	</reference>
+            	</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+	    <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+            commandId="org.eclipse.xtext.ui.editor.FindReferences">
+            <activeWhen>
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+    </extension>   
+
+<!-- adding resource factories -->
+
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="statemachine">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+        <resourceServiceProvider
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+            uriExtension="statemachine">
+        </resourceServiceProvider>
+    </extension>
+
+
+	<!-- marker definitions for org.eclipse.osbp.xtext.statemachine.StatemachineDSL -->
+	<extension
+	        id="statemachinedsl.check.fast"
+	        name="StatemachineDSL Problem"
+	        point="org.eclipse.core.resources.markers">
+	    <super type="org.eclipse.xtext.ui.check.fast"/>
+	    <persistent value="true"/>
+	</extension>
+	<extension
+	        id="statemachinedsl.check.normal"
+	        name="StatemachineDSL Problem"
+	        point="org.eclipse.core.resources.markers">
+	    <super type="org.eclipse.xtext.ui.check.normal"/>
+	    <persistent value="true"/>
+	</extension>
+	<extension
+	        id="statemachinedsl.check.expensive"
+	        name="StatemachineDSL 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.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+            fileExtensions="statemachine"
+            >
+      </participant>
+   </extension>
+   <extension
+            point="org.eclipse.ui.preferencePages">
+        <page
+            category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.compiler.preferencePage"
+            name="Compiler">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+        </page>
+    </extension>
+    <extension
+            point="org.eclipse.ui.propertyPages">
+        <page
+            category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.compiler.propertyPage"
+            name="Compiler">
+            <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+            <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.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+    <!-- quickfix marker resolution generator for org.eclipse.osbp.xtext.statemachine.StatemachineDSL -->
+    <extension
+            point="org.eclipse.ui.ide.markerResolution">
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.statemachine.ui.statemachinedsl.check.fast">
+            <attribute
+                name="FIXABLE_KEY"
+                value="true">
+            </attribute>
+        </markerResolutionGenerator>
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.statemachine.ui.statemachinedsl.check.normal">
+            <attribute
+                name="FIXABLE_KEY"
+                value="true">
+            </attribute>
+        </markerResolutionGenerator>
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.statemachine.ui.statemachinedsl.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.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+			commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.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.statemachine.StatemachineDSL.Editor.opened">
+               </reference>
+            </visibleWhen>
+         </command>
+      </menuContribution>
+   </extension>
+   <extension point="org.eclipse.ui.preferencePages">
+	    <page
+	        category="org.eclipse.osbp.xtext.statemachine.StatemachineDSL"
+	        class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+	        id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.refactoring"
+	        name="Refactoring">
+	        <keywordReference id="org.eclipse.osbp.xtext.statemachine.ui.keyword_StatemachineDSL"/>
+	    </page>
+	</extension>
+
+<!-- Type Hierarchy  -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchyHandler"
+			commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchy">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler 
+			class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.hierarchy.QuickTypeHierarchyHandler"
+			commandId="org.eclipse.jdt.ui.edit.text.java.open.hierarchy">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchy"
+				style="push"
+				tooltip="Open Type Hierarchy">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.jdt.ui.edit.text.java.open.hierarchy"
+				style="push"
+				tooltip="Quick Type Hierarchy">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- Call Hierachy -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.hierarchy.OpenCallHierachyHandler"
+			commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenCallHierarchy">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenCallHierarchy"
+				style="push"
+				tooltip="Open Call Hierarchy">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension
+         point="org.eclipse.core.runtime.adapters">
+      <factory class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.builder.smap.StratumBreakpointAdapterFactory"
+         adaptableType="org.eclipse.xtext.ui.editor.XtextEditor">
+         <adapter type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget"/>
+      </factory> 
+   </extension>
+   <extension point="org.eclipse.ui.editorActions">
+      <editorContribution targetID="org.eclipse.osbp.xtext.statemachine.StatemachineDSL" 
+                          id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.rulerActions">
+	     <action
+	             label="Not Used"
+	             class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+	             style="push"
+	             actionID="RulerDoubleClick"
+	             id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.doubleClickBreakpointAction"/>
+	  </editorContribution>
+   </extension>
+   <extension point="org.eclipse.ui.popupMenus">
+      <viewerContribution
+         targetID="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.RulerContext"
+         id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.RulerPopupActions">
+         <action
+            label="Toggle Breakpoint"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+            menubarPath="debug"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.rulerContextMenu.toggleBreakpointAction">
+         </action>
+         <action
+            label="Not used"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
+            menubarPath="debug"
+            id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.rulerContextMenu.enableDisableBreakpointAction">
+         </action>
+         <action
+           label="Breakpoint Properties"
+           helpContextId="breakpoint_properties_action_context"
+           class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.jdt.debug.ui.actions.JavaBreakpointPropertiesRulerActionDelegate"
+           menubarPath="group.properties"
+           id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.rulerContextMenu.openBreapointPropertiesAction">
+         </action>
+      </viewerContribution>
+   </extension>
+    <!-- Introduce Local Variable Refactoring -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.refactoring.ExtractVariableHandler"
+			commandId="org.eclipse.xtext.xbase.ui.refactoring.ExtractLocalVariable">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+    <extension point="org.eclipse.ui.menus">
+         <menuContribution
+            locationURI="popup:#TextEditorContext?after=group.edit">
+         <command commandId="org.eclipse.xtext.xbase.ui.refactoring.ExtractLocalVariable"
+               style="push">
+            <visibleWhen checkEnabled="false">
+               <reference
+                     definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+               </reference>
+            </visibleWhen>
+         </command>
+      </menuContribution>
+   </extension>  
+   <!-- Open implementation -->
+   <extension point="org.eclipse.ui.handlers">
+      <handler
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.navigation.OpenImplementationHandler"
+            commandId="org.eclipse.xtext.xbase.ui.OpenImplementationCommand">
+            <activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+				</reference>
+			</activeWhen>
+      </handler>
+   </extension>
+ <extension point="org.eclipse.ui.menus">
+       <menuContribution
+            locationURI="menu:navigate?after=open.ext4">
+         <command commandId="org.eclipse.xtext.xbase.ui.OpenImplementationCommand">
+		<visibleWhen checkEnabled="false">
+              <reference
+                 definitionId="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.Editor.opened">
+              </reference>
+		</visibleWhen>
+         </command>
+      </menuContribution>
+   </extension>
+
+  <extension point="org.eclipse.compare.contentViewers">
+    <viewer id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.compare.contentViewers"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+            extensions="statemachine">
+    </viewer>
+  </extension>
+  <extension point="org.eclipse.compare.contentMergeViewers">
+    <viewer id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.compare.contentMergeViewers"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+            extensions="statemachine" label="StatemachineDSL Compare">
+     </viewer>
+  </extension>
+  <extension point="org.eclipse.ui.editors.documentProviders">
+    <provider id="org.eclipse.osbp.xtext.statemachine.StatemachineDSL.editors.documentProviders"
+            class="org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+            extensions="statemachine">
+    </provider>
+  </extension>
+
+</plugin>
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/pom.xml b/org.eclipse.osbp.xtext.statemachine.ui/pom.xml
new file mode 100644
index 0000000..c43ce20
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/pom.xml
@@ -0,0 +1,31 @@
+<?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:
+# 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.statemachine</groupId>
+        <artifactId>org.eclipse.osbp.xtext.statemachine.aggregator</artifactId>
+        <version>0.9.0-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+
+    <artifactId>org.eclipse.osbp.xtext.statemachine.ui</artifactId>
+    <packaging>eclipse-plugin</packaging>
+
+    <build>
+        <sourceDirectory>src</sourceDirectory>
+    </build>
+
+	</project>
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/AbstractStatemachineDSLUiModule.java b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/AbstractStatemachineDSLUiModule.java
new file mode 100644
index 0000000..66fb1f0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/AbstractStatemachineDSLUiModule.java
@@ -0,0 +1,374 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.ui;
+
+import org.eclipse.xtext.ui.DefaultUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * Manual modifications go to {org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLUiModule}
+ */
+@SuppressWarnings("all")
+public abstract class AbstractStatemachineDSLUiModule extends DefaultUiModule {
+	
+	public AbstractStatemachineDSLUiModule(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.ui.generator.ImplicitUiFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.XtextEditor> bindXtextEditor() {
+		return org.eclipse.xtext.xbase.ui.editor.XbaseEditor.class;
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.ImplicitUiFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.model.XtextDocumentProvider> bindXtextDocumentProvider() {
+		return org.eclipse.xtext.xbase.ui.editor.XbaseDocumentProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.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.statemachine.parser.antlr.internal.InternalStatemachineDSLLexer.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.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.statemachine.ui.labeling.StatemachineDSLLabelProvider.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.statemachine.ui.labeling.StatemachineDSLDescriptionLabelProvider.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.statemachine.ui.outline.StatemachineDSLOutlineTreeProvider.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.statemachine.ui.outline.StatemachineDSLOutlineTreeProvider.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.statemachine.ui.quickfix.StatemachineDSLQuickfixProvider.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.statemachine.ui.contentassist.StatemachineDSLProposalProvider.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.statemachine.ui.contentassist.antlr.StatemachineDSLParser.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
+	public void configureContentAssistLexerProvider(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr.internal.InternalStatemachineDSLLexer.class).toProvider(org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr.internal.InternalStatemachineDSLLexer.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.statemachine.ui.contentassist.antlr.internal.InternalStatemachineDSLLexer.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.ui.IRenameSupport.Factory> bindIRenameSupport$Factory() {
+		return org.eclipse.xtext.common.types.ui.refactoring.JdtRenameSupport.Factory.class;
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.refactoring.RefactorElementNameFragment
+	public Class<? extends org.eclipse.xtext.ui.refactoring.IRenameStrategy.Provider> bindIRenameStrategy$Provider() {
+		return org.eclipse.xtext.common.types.ui.refactoring.participant.JvmMemberRenameStrategy.Provider.class;
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.refactoring.RefactorElementNameFragment
+	public void configureJvmMemberRenameStrategy$Provider$Delegate(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.ui.refactoring.IRenameStrategy.Provider.class).annotatedWith(org.eclipse.xtext.common.types.ui.refactoring.participant.JvmMemberRenameStrategy.Provider.Delegate.class).to(org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategyProvider.class);
+	}
+
+	// contributed by org.eclipse.xtext.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.contentassist.PrefixMatcher> bindPrefixMatcher() {
+		return org.eclipse.xtext.ui.editor.contentassist.FQNPrefixMatcher.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.IValidationJobScheduler> bindIValidationJobScheduler() {
+		return org.eclipse.xtext.common.types.xtext.ui.JdtValidationJobScheduler.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.refactoring.impl.RefactoringResourceSetProvider> bindRefactoringResourceSetProvider() {
+		return org.eclipse.xtext.common.types.ui.refactoring.JvmRefactoringResourceSetProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.syntaxcoloring.AbstractAntlrTokenToAttributeIdMapper> bindAbstractAntlrTokenToAttributeIdMapper() {
+		return org.eclipse.xtext.xbase.ui.syntaxcoloring.XbaseTokenToAttributeIdMapper.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.AbstractJavaBasedContentProposalProvider.ReferenceProposalCreator> bindAbstractJavaBasedContentProposalProvider$ReferenceProposalCreator() {
+		return org.eclipse.xtext.xbase.ui.contentassist.XbaseReferenceProposalCreator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.jface.text.contentassist.IContentAssistProcessor> bindIContentAssistProcessor() {
+		return org.eclipse.xtext.ui.editor.contentassist.RepeatedContentAssistProcessor.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() {
+		return org.eclipse.xtext.xbase.ui.highlighting.XbaseHighlightingCalculator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration> bindIHighlightingConfiguration() {
+		return org.eclipse.xtext.xbase.ui.highlighting.XbaseHighlightingConfiguration.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider> bindIEObjectHoverProvider() {
+		return org.eclipse.xtext.xbase.ui.hover.XbaseHoverProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.hover.IEObjectHover> bindIEObjectHover() {
+		return org.eclipse.xtext.xbase.ui.hover.XbaseDispatchingEObjectTextHover.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.hover.html.IEObjectHoverDocumentationProvider> bindIEObjectHoverDocumentationProvider() {
+		return org.eclipse.xtext.xbase.ui.hover.XbaseHoverDocumentationProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider.CrossRefResolutionConverter> bindDefaultQuickfixProvider$CrossRefResolutionConverter() {
+		return org.eclipse.xtext.xbase.ui.quickfix.XbaseCrossRefResolutionConverter.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.xtext.xbase.ui.validation.XbaseUIValidator> bindXbaseUIValidator() {
+		return org.eclipse.xtext.xbase.ui.validation.XbaseUIValidator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper> bindIHyperlinkHelper() {
+		return org.eclipse.xtext.xbase.ui.navigation.TypeLiteralAwareHyperlinkHelper.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.typesystem.internal.IFeatureScopeTracker.Provider> bindIFeatureScopeTracker$Provider() {
+		return org.eclipse.xtext.xbase.typesystem.internal.OptimizingFeatureScopeTrackerProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler> bindFindReferencesHandler() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.findrefs.JvmModelFindReferenceHandler.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.findrefs.ReferenceQueryExecutor> bindReferenceQueryExecutor() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.findrefs.JvmModelReferenceQueryExecutor.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.refactoring.IDependentElementsCalculator> bindIDependentElementsCalculator() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.JvmModelDependentElementsCalculator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.refactoring.IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.jdt.CombinedJvmJdtRenameRefactoringProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.refactoring.IReferenceUpdater> bindIReferenceUpdater() {
+		return org.eclipse.xtext.xbase.ui.refactoring.XbaseReferenceUpdater.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.refactoring.ui.IRenameContextFactory> bindIRenameContextFactory() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.jdt.CombinedJvmJdtRenameContextFactory.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.ui.refactoring.participant.JdtRenameParticipant.ContextFactory> bindJdtRenameParticipant$ContextFactory() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.JvmModelJdtRenameParticipantContext.ContextFactory.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.refactoring.IRenameStrategy> bindIRenameStrategy() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.DefaultJvmModelRenameStrategy.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.outline.impl.OutlineNodeElementOpener> bindOutlineNodeElementOpener() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.outline.JvmOutlineNodeElementOpener.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.GlobalURIEditorOpener> bindGlobalURIEditorOpener() {
+		return org.eclipse.xtext.common.types.ui.navigation.GlobalDerivedMemberAwareURIEditorOpener.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.occurrences.IOccurrenceComputer> bindIOccurrenceComputer() {
+		return org.eclipse.xtext.xbase.ui.jvmmodel.occurrence.JvmModelOccurrenceComputer.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.ui.query.IJavaSearchParticipation> bindIJavaSearchParticipation() {
+		return org.eclipse.xtext.common.types.ui.query.IJavaSearchParticipation.No.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public void configureLanguageSpecificURIEditorOpener(com.google.inject.Binder binder) {
+		if (org.eclipse.ui.PlatformUI.isWorkbenchRunning()) { 
+			binder.bind(org.eclipse.xtext.ui.editor.IURIEditorOpener.class).annotatedWith(org.eclipse.xtext.ui.LanguageSpecific.class).to(org.eclipse.xtext.xbase.ui.jvmmodel.navigation.DerivedMemberAwareEditorOpener.class); 
+			binder.bind(org.eclipse.xtext.common.types.ui.navigation.IDerivedMemberAwareEditorOpener.class).to(org.eclipse.xtext.xbase.ui.jvmmodel.navigation.DerivedMemberAwareEditorOpener.class); 
+		};
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.jface.text.hyperlink.IHyperlinkDetector> bindIHyperlinkDetector() {
+		return org.eclipse.xtext.xbase.ui.navigation.XbaseHyperlinkDetector.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.ui.quickfix.JavaTypeQuickfixes> bindJavaTypeQuickfixes() {
+		return org.eclipse.xtext.xbase.ui.quickfix.JavaTypeQuickfixesNoImportSection.class;
+	}
+
+	// contributed by org.eclipse.xtext.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.statemachine.ui.contentassist.antlr.PartialStatemachineDSLContentAssistParser.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/StatemachineDSLExecutableExtensionFactory.java b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/StatemachineDSLExecutableExtensionFactory.java
new file mode 100644
index 0000000..2143205
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/StatemachineDSLExecutableExtensionFactory.java
@@ -0,0 +1,39 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.ui;
+
+import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
+import org.osgi.framework.Bundle;
+
+import com.google.inject.Injector;
+
+import org.eclipse.osbp.xtext.statemachine.ui.internal.StatemachineDSLActivator;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class StatemachineDSLExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
+
+	@Override
+	protected Bundle getBundle() {
+		return StatemachineDSLActivator.getInstance().getBundle();
+	}
+	
+	@Override
+	protected Injector getInjector() {
+		return StatemachineDSLActivator.getInstance().getInjector(StatemachineDSLActivator.ORG_ECLIPSE_OSBP_XTEXT_STATEMACHINE_STATEMACHINEDSL);
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/AbstractStatemachineDSLProposalProvider.java b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/AbstractStatemachineDSLProposalProvider.java
new file mode 100644
index 0000000..0889696
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/AbstractStatemachineDSLProposalProvider.java
@@ -0,0 +1,927 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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.annotations.ui.contentassist.XbaseWithAnnotationsProposalProvider}.
+ * Methods are dynamically dispatched on the first parameter, i.e., you can override them 
+ * with a more concrete subtype. 
+ */
+@SuppressWarnings("all")
+public class AbstractStatemachineDSLProposalProvider extends org.eclipse.xtext.xbase.annotations.ui.contentassist.XbaseWithAnnotationsProposalProvider {
+		
+	public void completeStatemachineModel_Packages(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachinePackage_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachinePackage_Imports(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachinePackage_Statemachines(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Description(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachine_DescriptionValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_FunctionGroup(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_InitialState(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_InitialEvent(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Events(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Controls(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_States(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineEvent_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineState_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineState_Triggers(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineState_Identity(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineState_Keystroke(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineState_HasKeyOperation(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachineState_KeyOperation(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineTrigger_Triggers(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineTrigger_Guards(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineTrigger_HasTransition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachineTrigger_Transition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineTrigger_Actions(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralBlinkRate_BlinkRate(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralBlinkRate_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralClear_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCreateWindow_ViewportRow(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCreateWindow_ViewportColumn(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCreateWindow_ViewportHeight(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCreateWindow_ViewportWidth(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCreateWindow_WindowHeight(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCreateWindow_WindowWidth(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCreateWindow_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCursorType_CursorType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralCursorType_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDestroyWindow_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDeviceBrightness_Brightness(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDeviceBrightness_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayBitmap_BitmapId(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayBitmap_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayText_Text(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayText_HasType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachineActionPeripheralDisplayText_TextType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayText_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayTextAt_Text(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayTextAt_Row(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayTextAt_Column(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayTextAt_HasType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachineActionPeripheralDisplayTextAt_TextType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralDisplayTextAt_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralInterCharacterWait_Wait(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralInterCharacterWait_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralMarqueeFormat_Format(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralMarqueeFormat_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralMarqueeRepeatWait_Wait(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralMarqueeRepeatWait_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralMarqueeType_MarqueeType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralMarqueeType_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralMarqueeUnitWait_Wait(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralMarqueeUnitWait_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralScroll_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralScroll_Units(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralScroll_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralOpenDrawer_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintBarcode_Data(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintBarcode_BarcodeType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintBarcode_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintBitmap_BitmapId(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintBitmap_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintCut_Text(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintCut_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintNormal_Text(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintNormal_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintRegisterBitmap_BitmapId(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintRegisterBitmap_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintRegisterBitmap_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTOpen_Host(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTOpen_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTOpen_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTClose_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTAcknowledge_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTReversal_Password(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTReversal_Receipt(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTReversal_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTRegistration_Password(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTRegistration_Configuration(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTRegistration_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTAuthorization_Amount(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTAuthorization_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPTResponse_Device(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintReport_Report(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionPeripheralPrintReport_HasFilter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachineActionPeripheralPrintReport_Key(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineOperation_Operation(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineOperation_First(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineOperation_More(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineGuard_Guard(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineGuard_HasOnFail(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachineGuard_OnFailCaption(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineGuard_OnFailDescription(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineGuard_OnFailType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineFunction_Function(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineFunction_First(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineFunction_More(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineStorage_Content(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineStorage_Key(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineStorage_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineStorageRetrieve_Key(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineStorageRetrieve_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionConditionalTransition_Transition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionConditionalTransition_Guard(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionConditionalTransition_Actions(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceString_Text(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceNumber_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceEvaluate_Evaluationtype(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceTranslate_Text(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceDtoAttribute_Dto(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceDtoAttribute_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceStringMore_Text(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceNumberMore_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceEvaluateMore_Evaluationtype(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceTranslateMore_Text(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldGetMore_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineOperationMore_Operation(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineStorageRetrieveMore_Key(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineStorageRetrieveMore_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceDtoAttributeMore_Dto(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSourceDtoAttributeMore_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldConcatenation_First(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldConcatenation_More(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineOperationParameter_Source(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineOperationParameterMore_Source(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSet_Source(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldSet_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldClear_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldGet_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionFieldRemove_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionItemVisible_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionItemInvisible_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionButtonCaption_Caption(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionButtonCaption_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionButtonImage_Image(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionButtonImage_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionDTOFind_Search(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionDTOFind_Dto(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionDTOFind_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineActionScheduler_Scheduler(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButton_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButton_EventType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButton_Buttons(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlField_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlField_Fields(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlField_Layouts(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlDTO_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlDTO_Dtos(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlScheduler_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlScheduler_Schedulers(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachinePeripheralDeviceLineDisplay_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachinePeripheralDevicePOSPrinter_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachinePeripheralDeviceCashDrawer_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachinePeripheralDevicePT_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlPeripheral_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlPeripheral_LineDisplays(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlPeripheral_PosPrinters(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlPeripheral_CashDrawers(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlPeripheral_PaymentTerminals(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButtonAttribute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButtonAttribute_HasImage(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachineControlButtonAttribute_Image(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButtonAttribute_Event(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButtonAttributeEventKeyboard_Keystroke(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButtonAttributeEventIdentity_Identity(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlButtonAttributeEventEvent_Event(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlFieldAttribute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlFieldAttribute_AttributeType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlFieldLayout_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlDTOAttribute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlDTOAttribute_AttributeType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlDTOAttribute_HasEvent(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachineControlDTOAttribute_Event(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlSchedulerAttribute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlSchedulerAttribute_Delay(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineControlSchedulerAttribute_Event(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineDTOType_AttributeType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineFieldType_AttributeType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineImport_ImportedNamespace(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+    
+	public void complete_StatemachineModel(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachinePackage(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Statemachine(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineEvent(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineState(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineTrigger(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineAction(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralBlinkRate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralClear(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralCreateWindow(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralCursorType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralDestroyWindow(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralDeviceBrightness(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralDisplayBitmap(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralDisplayText(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralDisplayTextAt(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralInterCharacterWait(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralMarqueeFormat(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralMarqueeRepeatWait(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralMarqueeType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralMarqueeUnitWait(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralScroll(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralOpenDrawer(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPrintBarcode(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPrintBitmap(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPrintCut(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPrintNormal(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPrintRegisterBitmap(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPTOpen(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPTClose(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPTAcknowledge(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPTReversal(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPTRegistration(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPTAuthorization(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPTResponse(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionPeripheralPrintReport(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSource(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineOperation(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineGuard(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineFunction(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineStorage(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineStorageRetrieve(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionConditionalTransition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceString(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceNumber(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceEvaluate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceEvent(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceTranslate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceDtoAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceStringMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceNumberMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceEvaluateMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceTranslateMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldGetMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineOperationMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineStorageRetrieveMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSourceDtoAttributeMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldConcatenation(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineOperationParameter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineOperationParameterMore(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldSet(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldClear(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldGet(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionFieldRemove(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlVisibility(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionItemVisible(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionItemInvisible(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionButtonCaption(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionButtonImage(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionDTOFind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineActionScheduler(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlButton(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlField(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlDTO(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlScheduler(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachinePeripheralDeviceLineDisplay(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachinePeripheralDevicePOSPrinter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachinePeripheralDeviceCashDrawer(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachinePeripheralDevicePT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlPeripheral(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlButtonAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlButtonAttributeEvent(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlButtonAttributeEventKeyboard(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlButtonAttributeEventIdentity(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlButtonAttributeEventEvent(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlFieldAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlFieldLayout(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlDTOAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlSchedulerAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineDTOType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineFieldType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineInternalType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineControlButtonEventType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineEvaluationType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineUserMessageType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineLineDisplayCursorType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineLineDisplayMarqueeType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineLineDisplayMarqueeFormat(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineLineDisplayTextType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineLineDisplayScrollTextType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachinePOSPrinterBarcodeType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineImport(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineQualifiedNameWithWildCard(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_TRANSLATABLESTRING(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TRANSLATABLEID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SignedNumber(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_UnsignedNumber(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/PartialStatemachineDSLContentAssistParser.java b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/PartialStatemachineDSLContentAssistParser.java
new file mode 100644
index 0000000..168b8b7
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/PartialStatemachineDSLContentAssistParser.java
@@ -0,0 +1,48 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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 PartialStatemachineDSLContentAssistParser extends StatemachineDSLParser 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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/StatemachineDSLParser.java b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/StatemachineDSLParser.java
new file mode 100644
index 0000000..778692a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/StatemachineDSLParser.java
@@ -0,0 +1,787 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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.statemachine.services.StatemachineDSLGrammarAccess;
+
+public class StatemachineDSLParser extends AbstractContentAssistParser {
+	
+	@Inject
+	private StatemachineDSLGrammarAccess grammarAccess;
+	
+	private Map<AbstractElement, String> nameMappings;
+	
+	@Override
+	protected org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr.internal.InternalStatemachineDSLParser createParser() {
+		org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr.internal.InternalStatemachineDSLParser result = new org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr.internal.InternalStatemachineDSLParser(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.getStatemachineActionAccess().getAlternatives(), "rule__StatemachineAction__Alternatives");
+					put(grammarAccess.getStatemachineActionFieldSourceAccess().getAlternatives(), "rule__StatemachineActionFieldSource__Alternatives");
+					put(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getAlternatives(), "rule__StatemachineActionFieldSourceMore__Alternatives");
+					put(grammarAccess.getStatemachineControlVisibilityAccess().getAlternatives(), "rule__StatemachineControlVisibility__Alternatives");
+					put(grammarAccess.getStatemachineControlAccess().getAlternatives(), "rule__StatemachineControl__Alternatives");
+					put(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getAlternatives(), "rule__StatemachineControlButtonAttributeEvent__Alternatives");
+					put(grammarAccess.getXAnnotationAccess().getAlternatives_3_1(), "rule__XAnnotation__Alternatives_3_1");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives(), "rule__XAnnotationElementValueOrCommaList__Alternatives");
+					put(grammarAccess.getXAnnotationElementValueAccess().getAlternatives(), "rule__XAnnotationElementValue__Alternatives");
+					put(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives(), "rule__XAnnotationOrExpression__Alternatives");
+					put(grammarAccess.getXAssignmentAccess().getAlternatives(), "rule__XAssignment__Alternatives");
+					put(grammarAccess.getOpMultiAssignAccess().getAlternatives(), "rule__OpMultiAssign__Alternatives");
+					put(grammarAccess.getOpEqualityAccess().getAlternatives(), "rule__OpEquality__Alternatives");
+					put(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1(), "rule__XRelationalExpression__Alternatives_1");
+					put(grammarAccess.getOpCompareAccess().getAlternatives(), "rule__OpCompare__Alternatives");
+					put(grammarAccess.getOpOtherAccess().getAlternatives(), "rule__OpOther__Alternatives");
+					put(grammarAccess.getOpOtherAccess().getAlternatives_5_1(), "rule__OpOther__Alternatives_5_1");
+					put(grammarAccess.getOpOtherAccess().getAlternatives_6_1(), "rule__OpOther__Alternatives_6_1");
+					put(grammarAccess.getOpAddAccess().getAlternatives(), "rule__OpAdd__Alternatives");
+					put(grammarAccess.getOpMultiAccess().getAlternatives(), "rule__OpMulti__Alternatives");
+					put(grammarAccess.getXUnaryOperationAccess().getAlternatives(), "rule__XUnaryOperation__Alternatives");
+					put(grammarAccess.getOpUnaryAccess().getAlternatives(), "rule__OpUnary__Alternatives");
+					put(grammarAccess.getOpPostfixAccess().getAlternatives(), "rule__OpPostfix__Alternatives");
+					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1(), "rule__XMemberFeatureCall__Alternatives_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1(), "rule__XMemberFeatureCall__Alternatives_1_0_0_0_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1(), "rule__XMemberFeatureCall__Alternatives_1_1_0_0_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1(), "rule__XMemberFeatureCall__Alternatives_1_1_3_1");
+					put(grammarAccess.getXPrimaryExpressionAccess().getAlternatives(), "rule__XPrimaryExpression__Alternatives");
+					put(grammarAccess.getXLiteralAccess().getAlternatives(), "rule__XLiteral__Alternatives");
+					put(grammarAccess.getXCollectionLiteralAccess().getAlternatives(), "rule__XCollectionLiteral__Alternatives");
+					put(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2(), "rule__XSwitchExpression__Alternatives_2");
+					put(grammarAccess.getXCasePartAccess().getAlternatives_3(), "rule__XCasePart__Alternatives_3");
+					put(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives(), "rule__XExpressionOrVarDeclaration__Alternatives");
+					put(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1(), "rule__XVariableDeclaration__Alternatives_1");
+					put(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2(), "rule__XVariableDeclaration__Alternatives_2");
+					put(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1(), "rule__XFeatureCall__Alternatives_3_1");
+					put(grammarAccess.getFeatureCallIDAccess().getAlternatives(), "rule__FeatureCallID__Alternatives");
+					put(grammarAccess.getIdOrSuperAccess().getAlternatives(), "rule__IdOrSuper__Alternatives");
+					put(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1(), "rule__XConstructorCall__Alternatives_4_1");
+					put(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1(), "rule__XBooleanLiteral__Alternatives_1");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3(), "rule__XTryCatchFinallyExpression__Alternatives_3");
+					put(grammarAccess.getNumberAccess().getAlternatives(), "rule__Number__Alternatives");
+					put(grammarAccess.getNumberAccess().getAlternatives_1_0(), "rule__Number__Alternatives_1_0");
+					put(grammarAccess.getNumberAccess().getAlternatives_1_1_1(), "rule__Number__Alternatives_1_1_1");
+					put(grammarAccess.getJvmTypeReferenceAccess().getAlternatives(), "rule__JvmTypeReference__Alternatives");
+					put(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives(), "rule__JvmArgumentTypeReference__Alternatives");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2(), "rule__JvmWildcardTypeReference__Alternatives_2");
+					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_1(), "rule__XImportDeclaration__Alternatives_1");
+					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_1_0_3(), "rule__XImportDeclaration__Alternatives_1_0_3");
+					put(grammarAccess.getStatemachineInternalTypeAccess().getAlternatives(), "rule__StatemachineInternalType__Alternatives");
+					put(grammarAccess.getStatemachineControlButtonEventTypeAccess().getAlternatives(), "rule__StatemachineControlButtonEventType__Alternatives");
+					put(grammarAccess.getStatemachineEvaluationTypeAccess().getAlternatives(), "rule__StatemachineEvaluationType__Alternatives");
+					put(grammarAccess.getStatemachineUserMessageTypeAccess().getAlternatives(), "rule__StatemachineUserMessageType__Alternatives");
+					put(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getAlternatives(), "rule__StatemachineLineDisplayCursorType__Alternatives");
+					put(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getAlternatives(), "rule__StatemachineLineDisplayMarqueeType__Alternatives");
+					put(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getAlternatives(), "rule__StatemachineLineDisplayMarqueeFormat__Alternatives");
+					put(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getAlternatives(), "rule__StatemachineLineDisplayTextType__Alternatives");
+					put(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getAlternatives(), "rule__StatemachineLineDisplayScrollTextType__Alternatives");
+					put(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getAlternatives(), "rule__StatemachinePOSPrinterBarcodeType__Alternatives");
+					put(grammarAccess.getStatemachinePackageAccess().getGroup(), "rule__StatemachinePackage__Group__0");
+					put(grammarAccess.getStatemachinePackageAccess().getGroup_3(), "rule__StatemachinePackage__Group_3__0");
+					put(grammarAccess.getStatemachineAccess().getGroup(), "rule__Statemachine__Group__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_2(), "rule__Statemachine__Group_2__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_3(), "rule__Statemachine__Group_3__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8(), "rule__Statemachine__Group_8__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_1(), "rule__Statemachine__Group_8_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_9(), "rule__Statemachine__Group_9__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_10(), "rule__Statemachine__Group_10__0");
+					put(grammarAccess.getStatemachineEventAccess().getGroup(), "rule__StatemachineEvent__Group__0");
+					put(grammarAccess.getStatemachineStateAccess().getGroup(), "rule__StatemachineState__Group__0");
+					put(grammarAccess.getStatemachineStateAccess().getGroup_3_0(), "rule__StatemachineState__Group_3_0__0");
+					put(grammarAccess.getStatemachineStateAccess().getGroup_3_1(), "rule__StatemachineState__Group_3_1__0");
+					put(grammarAccess.getStatemachineStateAccess().getGroup_3_2(), "rule__StatemachineState__Group_3_2__0");
+					put(grammarAccess.getStatemachineStateAccess().getGroup_3_2_3(), "rule__StatemachineState__Group_3_2_3__0");
+					put(grammarAccess.getStatemachineTriggerAccess().getGroup(), "rule__StatemachineTrigger__Group__0");
+					put(grammarAccess.getStatemachineTriggerAccess().getGroup_3(), "rule__StatemachineTrigger__Group_3__0");
+					put(grammarAccess.getStatemachineTriggerAccess().getGroup_5(), "rule__StatemachineTrigger__Group_5__0");
+					put(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getGroup(), "rule__StatemachineActionPeripheralBlinkRate__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralClearAccess().getGroup(), "rule__StatemachineActionPeripheralClear__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getGroup(), "rule__StatemachineActionPeripheralCreateWindow__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getGroup(), "rule__StatemachineActionPeripheralCursorType__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getGroup(), "rule__StatemachineActionPeripheralDestroyWindow__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getGroup(), "rule__StatemachineActionPeripheralDeviceBrightness__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getGroup(), "rule__StatemachineActionPeripheralDisplayBitmap__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getGroup(), "rule__StatemachineActionPeripheralDisplayText__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getGroup_3(), "rule__StatemachineActionPeripheralDisplayText__Group_3__0");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getGroup(), "rule__StatemachineActionPeripheralDisplayTextAt__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getGroup_7(), "rule__StatemachineActionPeripheralDisplayTextAt__Group_7__0");
+					put(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getGroup(), "rule__StatemachineActionPeripheralInterCharacterWait__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getGroup(), "rule__StatemachineActionPeripheralMarqueeFormat__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getGroup(), "rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getGroup(), "rule__StatemachineActionPeripheralMarqueeType__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getGroup(), "rule__StatemachineActionPeripheralMarqueeUnitWait__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralScrollAccess().getGroup(), "rule__StatemachineActionPeripheralScroll__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getGroup(), "rule__StatemachineActionPeripheralOpenDrawer__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getGroup(), "rule__StatemachineActionPeripheralPrintBarcode__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getGroup(), "rule__StatemachineActionPeripheralPrintBitmap__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getGroup(), "rule__StatemachineActionPeripheralPrintCut__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getGroup(), "rule__StatemachineActionPeripheralPrintNormal__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getGroup(), "rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getGroup(), "rule__StatemachineActionPeripheralPTOpen__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getGroup(), "rule__StatemachineActionPeripheralPTClose__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getGroup(), "rule__StatemachineActionPeripheralPTAcknowledge__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getGroup(), "rule__StatemachineActionPeripheralPTReversal__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getGroup(), "rule__StatemachineActionPeripheralPTRegistration__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getGroup(), "rule__StatemachineActionPeripheralPTAuthorization__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getGroup(), "rule__StatemachineActionPeripheralPTResponse__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getGroup(), "rule__StatemachineActionPeripheralPrintReport__Group__0");
+					put(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getGroup_2(), "rule__StatemachineActionPeripheralPrintReport__Group_2__0");
+					put(grammarAccess.getStatemachineOperationAccess().getGroup(), "rule__StatemachineOperation__Group__0");
+					put(grammarAccess.getStatemachineGuardAccess().getGroup(), "rule__StatemachineGuard__Group__0");
+					put(grammarAccess.getStatemachineGuardAccess().getGroup_2(), "rule__StatemachineGuard__Group_2__0");
+					put(grammarAccess.getStatemachineFunctionAccess().getGroup(), "rule__StatemachineFunction__Group__0");
+					put(grammarAccess.getStatemachineStorageAccess().getGroup(), "rule__StatemachineStorage__Group__0");
+					put(grammarAccess.getStatemachineStorageRetrieveAccess().getGroup(), "rule__StatemachineStorageRetrieve__Group__0");
+					put(grammarAccess.getStatemachineActionConditionalTransitionAccess().getGroup(), "rule__StatemachineActionConditionalTransition__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSourceEventAccess().getGroup(), "rule__StatemachineActionFieldSourceEvent__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getGroup(), "rule__StatemachineActionFieldSourceTranslate__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getGroup(), "rule__StatemachineActionFieldSourceDtoAttribute__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getGroup(), "rule__StatemachineActionFieldSourceStringMore__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getGroup(), "rule__StatemachineActionFieldSourceNumberMore__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getGroup(), "rule__StatemachineActionFieldSourceEvaluateMore__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getGroup(), "rule__StatemachineActionFieldSourceTranslateMore__Group__0");
+					put(grammarAccess.getStatemachineActionFieldGetMoreAccess().getGroup(), "rule__StatemachineActionFieldGetMore__Group__0");
+					put(grammarAccess.getStatemachineOperationMoreAccess().getGroup(), "rule__StatemachineOperationMore__Group__0");
+					put(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getGroup(), "rule__StatemachineStorageRetrieveMore__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getGroup(), "rule__StatemachineActionFieldSourceDtoAttributeMore__Group__0");
+					put(grammarAccess.getStatemachineActionFieldConcatenationAccess().getGroup(), "rule__StatemachineActionFieldConcatenation__Group__0");
+					put(grammarAccess.getStatemachineOperationParameterMoreAccess().getGroup(), "rule__StatemachineOperationParameterMore__Group__0");
+					put(grammarAccess.getStatemachineActionFieldSetAccess().getGroup(), "rule__StatemachineActionFieldSet__Group__0");
+					put(grammarAccess.getStatemachineActionFieldClearAccess().getGroup(), "rule__StatemachineActionFieldClear__Group__0");
+					put(grammarAccess.getStatemachineActionFieldGetAccess().getGroup(), "rule__StatemachineActionFieldGet__Group__0");
+					put(grammarAccess.getStatemachineActionFieldRemoveAccess().getGroup(), "rule__StatemachineActionFieldRemove__Group__0");
+					put(grammarAccess.getStatemachineActionItemVisibleAccess().getGroup(), "rule__StatemachineActionItemVisible__Group__0");
+					put(grammarAccess.getStatemachineActionItemInvisibleAccess().getGroup(), "rule__StatemachineActionItemInvisible__Group__0");
+					put(grammarAccess.getStatemachineActionButtonCaptionAccess().getGroup(), "rule__StatemachineActionButtonCaption__Group__0");
+					put(grammarAccess.getStatemachineActionButtonImageAccess().getGroup(), "rule__StatemachineActionButtonImage__Group__0");
+					put(grammarAccess.getStatemachineActionDTOFindAccess().getGroup(), "rule__StatemachineActionDTOFind__Group__0");
+					put(grammarAccess.getStatemachineActionSchedulerAccess().getGroup(), "rule__StatemachineActionScheduler__Group__0");
+					put(grammarAccess.getStatemachineControlButtonAccess().getGroup(), "rule__StatemachineControlButton__Group__0");
+					put(grammarAccess.getStatemachineControlFieldAccess().getGroup(), "rule__StatemachineControlField__Group__0");
+					put(grammarAccess.getStatemachineControlDTOAccess().getGroup(), "rule__StatemachineControlDTO__Group__0");
+					put(grammarAccess.getStatemachineControlSchedulerAccess().getGroup(), "rule__StatemachineControlScheduler__Group__0");
+					put(grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getGroup(), "rule__StatemachinePeripheralDeviceLineDisplay__Group__0");
+					put(grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getGroup(), "rule__StatemachinePeripheralDevicePOSPrinter__Group__0");
+					put(grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getGroup(), "rule__StatemachinePeripheralDeviceCashDrawer__Group__0");
+					put(grammarAccess.getStatemachinePeripheralDevicePTAccess().getGroup(), "rule__StatemachinePeripheralDevicePT__Group__0");
+					put(grammarAccess.getStatemachineControlPeripheralAccess().getGroup(), "rule__StatemachineControlPeripheral__Group__0");
+					put(grammarAccess.getStatemachineControlButtonAttributeAccess().getGroup(), "rule__StatemachineControlButtonAttribute__Group__0");
+					put(grammarAccess.getStatemachineControlButtonAttributeAccess().getGroup_2(), "rule__StatemachineControlButtonAttribute__Group_2__0");
+					put(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getGroup(), "rule__StatemachineControlButtonAttributeEventKeyboard__Group__0");
+					put(grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getGroup(), "rule__StatemachineControlButtonAttributeEventIdentity__Group__0");
+					put(grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getGroup(), "rule__StatemachineControlButtonAttributeEventEvent__Group__0");
+					put(grammarAccess.getStatemachineControlFieldAttributeAccess().getGroup(), "rule__StatemachineControlFieldAttribute__Group__0");
+					put(grammarAccess.getStatemachineControlFieldLayoutAccess().getGroup(), "rule__StatemachineControlFieldLayout__Group__0");
+					put(grammarAccess.getStatemachineControlDTOAttributeAccess().getGroup(), "rule__StatemachineControlDTOAttribute__Group__0");
+					put(grammarAccess.getStatemachineControlDTOAttributeAccess().getGroup_4(), "rule__StatemachineControlDTOAttribute__Group_4__0");
+					put(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getGroup(), "rule__StatemachineControlSchedulerAttribute__Group__0");
+					put(grammarAccess.getStatemachineImportAccess().getGroup(), "rule__StatemachineImport__Group__0");
+					put(grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().getGroup(), "rule__StatemachineQualifiedNameWithWildCard__Group__0");
+					put(grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().getGroup_1(), "rule__StatemachineQualifiedNameWithWildCard__Group_1__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
+					put(grammarAccess.getSignedNumberAccess().getGroup(), "rule__SignedNumber__Group__0");
+					put(grammarAccess.getUnsignedNumberAccess().getGroup(), "rule__UnsignedNumber__Group__0");
+					put(grammarAccess.getUnsignedNumberAccess().getGroup_1(), "rule__UnsignedNumber__Group_1__0");
+					put(grammarAccess.getXAnnotationAccess().getGroup(), "rule__XAnnotation__Group__0");
+					put(grammarAccess.getXAnnotationAccess().getGroup_3(), "rule__XAnnotation__Group_3__0");
+					put(grammarAccess.getXAnnotationAccess().getGroup_3_1_0(), "rule__XAnnotation__Group_3_1_0__0");
+					put(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1(), "rule__XAnnotation__Group_3_1_0_1__0");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup(), "rule__XAnnotationElementValuePair__Group__0");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0(), "rule__XAnnotationElementValuePair__Group_0__0");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0(), "rule__XAnnotationElementValuePair__Group_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0(), "rule__XAnnotationElementValueOrCommaList__Group_0__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0(), "rule__XAnnotationElementValueOrCommaList__Group_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0(), "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1(), "rule__XAnnotationElementValueOrCommaList__Group_0_1__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1(), "rule__XAnnotationElementValueOrCommaList__Group_1__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_1_1__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0(), "rule__XAnnotationElementValue__Group_0__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0(), "rule__XAnnotationElementValue__Group_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0(), "rule__XAnnotationElementValue__Group_0_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1(), "rule__XAnnotationElementValue__Group_0_1__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1(), "rule__XAnnotationElementValue__Group_0_1_1__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_0(), "rule__XAssignment__Group_0__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_1(), "rule__XAssignment__Group_1__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_1_1(), "rule__XAssignment__Group_1_1__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_1_1_0(), "rule__XAssignment__Group_1_1_0__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0(), "rule__XAssignment__Group_1_1_0_0__0");
+					put(grammarAccess.getOpMultiAssignAccess().getGroup_5(), "rule__OpMultiAssign__Group_5__0");
+					put(grammarAccess.getOpMultiAssignAccess().getGroup_6(), "rule__OpMultiAssign__Group_6__0");
+					put(grammarAccess.getXOrExpressionAccess().getGroup(), "rule__XOrExpression__Group__0");
+					put(grammarAccess.getXOrExpressionAccess().getGroup_1(), "rule__XOrExpression__Group_1__0");
+					put(grammarAccess.getXOrExpressionAccess().getGroup_1_0(), "rule__XOrExpression__Group_1_0__0");
+					put(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0(), "rule__XOrExpression__Group_1_0_0__0");
+					put(grammarAccess.getXAndExpressionAccess().getGroup(), "rule__XAndExpression__Group__0");
+					put(grammarAccess.getXAndExpressionAccess().getGroup_1(), "rule__XAndExpression__Group_1__0");
+					put(grammarAccess.getXAndExpressionAccess().getGroup_1_0(), "rule__XAndExpression__Group_1_0__0");
+					put(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0(), "rule__XAndExpression__Group_1_0_0__0");
+					put(grammarAccess.getXEqualityExpressionAccess().getGroup(), "rule__XEqualityExpression__Group__0");
+					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1(), "rule__XEqualityExpression__Group_1__0");
+					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0(), "rule__XEqualityExpression__Group_1_0__0");
+					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0(), "rule__XEqualityExpression__Group_1_0_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup(), "rule__XRelationalExpression__Group__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0(), "rule__XRelationalExpression__Group_1_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0(), "rule__XRelationalExpression__Group_1_0_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0(), "rule__XRelationalExpression__Group_1_0_0_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1(), "rule__XRelationalExpression__Group_1_1__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0(), "rule__XRelationalExpression__Group_1_1_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0(), "rule__XRelationalExpression__Group_1_1_0_0__0");
+					put(grammarAccess.getOpCompareAccess().getGroup_1(), "rule__OpCompare__Group_1__0");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup(), "rule__XOtherOperatorExpression__Group__0");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1(), "rule__XOtherOperatorExpression__Group_1__0");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0(), "rule__XOtherOperatorExpression__Group_1_0__0");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0(), "rule__XOtherOperatorExpression__Group_1_0_0__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_2(), "rule__OpOther__Group_2__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_5(), "rule__OpOther__Group_5__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_5_1_0(), "rule__OpOther__Group_5_1_0__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0(), "rule__OpOther__Group_5_1_0_0__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_6(), "rule__OpOther__Group_6__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_6_1_0(), "rule__OpOther__Group_6_1_0__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0(), "rule__OpOther__Group_6_1_0_0__0");
+					put(grammarAccess.getXAdditiveExpressionAccess().getGroup(), "rule__XAdditiveExpression__Group__0");
+					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1(), "rule__XAdditiveExpression__Group_1__0");
+					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0(), "rule__XAdditiveExpression__Group_1_0__0");
+					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0(), "rule__XAdditiveExpression__Group_1_0_0__0");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup(), "rule__XMultiplicativeExpression__Group__0");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1(), "rule__XMultiplicativeExpression__Group_1__0");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0(), "rule__XMultiplicativeExpression__Group_1_0__0");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0(), "rule__XMultiplicativeExpression__Group_1_0_0__0");
+					put(grammarAccess.getXUnaryOperationAccess().getGroup_0(), "rule__XUnaryOperation__Group_0__0");
+					put(grammarAccess.getXCastedExpressionAccess().getGroup(), "rule__XCastedExpression__Group__0");
+					put(grammarAccess.getXCastedExpressionAccess().getGroup_1(), "rule__XCastedExpression__Group_1__0");
+					put(grammarAccess.getXCastedExpressionAccess().getGroup_1_0(), "rule__XCastedExpression__Group_1_0__0");
+					put(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0(), "rule__XCastedExpression__Group_1_0_0__0");
+					put(grammarAccess.getXPostfixOperationAccess().getGroup(), "rule__XPostfixOperation__Group__0");
+					put(grammarAccess.getXPostfixOperationAccess().getGroup_1(), "rule__XPostfixOperation__Group_1__0");
+					put(grammarAccess.getXPostfixOperationAccess().getGroup_1_0(), "rule__XPostfixOperation__Group_1_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup(), "rule__XMemberFeatureCall__Group__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0(), "rule__XMemberFeatureCall__Group_1_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0(), "rule__XMemberFeatureCall__Group_1_0_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0(), "rule__XMemberFeatureCall__Group_1_0_0_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1(), "rule__XMemberFeatureCall__Group_1_1__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0(), "rule__XMemberFeatureCall__Group_1_1_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0(), "rule__XMemberFeatureCall__Group_1_1_0_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1(), "rule__XMemberFeatureCall__Group_1_1_1__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2(), "rule__XMemberFeatureCall__Group_1_1_1_2__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3(), "rule__XMemberFeatureCall__Group_1_1_3__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1(), "rule__XMemberFeatureCall__Group_1_1_3_1_1__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1(), "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0");
+					put(grammarAccess.getXSetLiteralAccess().getGroup(), "rule__XSetLiteral__Group__0");
+					put(grammarAccess.getXSetLiteralAccess().getGroup_3(), "rule__XSetLiteral__Group_3__0");
+					put(grammarAccess.getXSetLiteralAccess().getGroup_3_1(), "rule__XSetLiteral__Group_3_1__0");
+					put(grammarAccess.getXListLiteralAccess().getGroup(), "rule__XListLiteral__Group__0");
+					put(grammarAccess.getXListLiteralAccess().getGroup_3(), "rule__XListLiteral__Group_3__0");
+					put(grammarAccess.getXListLiteralAccess().getGroup_3_1(), "rule__XListLiteral__Group_3_1__0");
+					put(grammarAccess.getXClosureAccess().getGroup(), "rule__XClosure__Group__0");
+					put(grammarAccess.getXClosureAccess().getGroup_0(), "rule__XClosure__Group_0__0");
+					put(grammarAccess.getXClosureAccess().getGroup_0_0(), "rule__XClosure__Group_0_0__0");
+					put(grammarAccess.getXClosureAccess().getGroup_1(), "rule__XClosure__Group_1__0");
+					put(grammarAccess.getXClosureAccess().getGroup_1_0(), "rule__XClosure__Group_1_0__0");
+					put(grammarAccess.getXClosureAccess().getGroup_1_0_0(), "rule__XClosure__Group_1_0_0__0");
+					put(grammarAccess.getXClosureAccess().getGroup_1_0_0_1(), "rule__XClosure__Group_1_0_0_1__0");
+					put(grammarAccess.getXExpressionInClosureAccess().getGroup(), "rule__XExpressionInClosure__Group__0");
+					put(grammarAccess.getXExpressionInClosureAccess().getGroup_1(), "rule__XExpressionInClosure__Group_1__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup(), "rule__XShortClosure__Group__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup_0(), "rule__XShortClosure__Group_0__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup_0_0(), "rule__XShortClosure__Group_0_0__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup_0_0_1(), "rule__XShortClosure__Group_0_0_1__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1(), "rule__XShortClosure__Group_0_0_1_1__0");
+					put(grammarAccess.getXParenthesizedExpressionAccess().getGroup(), "rule__XParenthesizedExpression__Group__0");
+					put(grammarAccess.getXIfExpressionAccess().getGroup(), "rule__XIfExpression__Group__0");
+					put(grammarAccess.getXIfExpressionAccess().getGroup_6(), "rule__XIfExpression__Group_6__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup(), "rule__XSwitchExpression__Group__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0(), "rule__XSwitchExpression__Group_2_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0(), "rule__XSwitchExpression__Group_2_0_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0(), "rule__XSwitchExpression__Group_2_0_0_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1(), "rule__XSwitchExpression__Group_2_1__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0(), "rule__XSwitchExpression__Group_2_1_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0(), "rule__XSwitchExpression__Group_2_1_0_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_5(), "rule__XSwitchExpression__Group_5__0");
+					put(grammarAccess.getXCasePartAccess().getGroup(), "rule__XCasePart__Group__0");
+					put(grammarAccess.getXCasePartAccess().getGroup_2(), "rule__XCasePart__Group_2__0");
+					put(grammarAccess.getXCasePartAccess().getGroup_3_0(), "rule__XCasePart__Group_3_0__0");
+					put(grammarAccess.getXForLoopExpressionAccess().getGroup(), "rule__XForLoopExpression__Group__0");
+					put(grammarAccess.getXForLoopExpressionAccess().getGroup_0(), "rule__XForLoopExpression__Group_0__0");
+					put(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0(), "rule__XForLoopExpression__Group_0_0__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup(), "rule__XBasicForLoopExpression__Group__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3(), "rule__XBasicForLoopExpression__Group_3__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1(), "rule__XBasicForLoopExpression__Group_3_1__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7(), "rule__XBasicForLoopExpression__Group_7__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1(), "rule__XBasicForLoopExpression__Group_7_1__0");
+					put(grammarAccess.getXWhileExpressionAccess().getGroup(), "rule__XWhileExpression__Group__0");
+					put(grammarAccess.getXDoWhileExpressionAccess().getGroup(), "rule__XDoWhileExpression__Group__0");
+					put(grammarAccess.getXBlockExpressionAccess().getGroup(), "rule__XBlockExpression__Group__0");
+					put(grammarAccess.getXBlockExpressionAccess().getGroup_2(), "rule__XBlockExpression__Group_2__0");
+					put(grammarAccess.getXVariableDeclarationAccess().getGroup(), "rule__XVariableDeclaration__Group__0");
+					put(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0(), "rule__XVariableDeclaration__Group_2_0__0");
+					put(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0(), "rule__XVariableDeclaration__Group_2_0_0__0");
+					put(grammarAccess.getXVariableDeclarationAccess().getGroup_3(), "rule__XVariableDeclaration__Group_3__0");
+					put(grammarAccess.getJvmFormalParameterAccess().getGroup(), "rule__JvmFormalParameter__Group__0");
+					put(grammarAccess.getFullJvmFormalParameterAccess().getGroup(), "rule__FullJvmFormalParameter__Group__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup(), "rule__XFeatureCall__Group__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_1(), "rule__XFeatureCall__Group_1__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_1_2(), "rule__XFeatureCall__Group_1_2__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_3(), "rule__XFeatureCall__Group_3__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1(), "rule__XFeatureCall__Group_3_1_1__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1(), "rule__XFeatureCall__Group_3_1_1_1__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup(), "rule__XConstructorCall__Group__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_3(), "rule__XConstructorCall__Group_3__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_3_2(), "rule__XConstructorCall__Group_3_2__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_4(), "rule__XConstructorCall__Group_4__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1(), "rule__XConstructorCall__Group_4_1_1__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1(), "rule__XConstructorCall__Group_4_1_1_1__0");
+					put(grammarAccess.getXBooleanLiteralAccess().getGroup(), "rule__XBooleanLiteral__Group__0");
+					put(grammarAccess.getXNullLiteralAccess().getGroup(), "rule__XNullLiteral__Group__0");
+					put(grammarAccess.getXNumberLiteralAccess().getGroup(), "rule__XNumberLiteral__Group__0");
+					put(grammarAccess.getXStringLiteralAccess().getGroup(), "rule__XStringLiteral__Group__0");
+					put(grammarAccess.getXTypeLiteralAccess().getGroup(), "rule__XTypeLiteral__Group__0");
+					put(grammarAccess.getXThrowExpressionAccess().getGroup(), "rule__XThrowExpression__Group__0");
+					put(grammarAccess.getXReturnExpressionAccess().getGroup(), "rule__XReturnExpression__Group__0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup(), "rule__XTryCatchFinallyExpression__Group__0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0(), "rule__XTryCatchFinallyExpression__Group_3_0__0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1(), "rule__XTryCatchFinallyExpression__Group_3_0_1__0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1(), "rule__XTryCatchFinallyExpression__Group_3_1__0");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup(), "rule__XSynchronizedExpression__Group__0");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0(), "rule__XSynchronizedExpression__Group_0__0");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0(), "rule__XSynchronizedExpression__Group_0_0__0");
+					put(grammarAccess.getXCatchClauseAccess().getGroup(), "rule__XCatchClause__Group__0");
+					put(grammarAccess.getNumberAccess().getGroup_1(), "rule__Number__Group_1__0");
+					put(grammarAccess.getNumberAccess().getGroup_1_1(), "rule__Number__Group_1_1__0");
+					put(grammarAccess.getStaticQualifierAccess().getGroup(), "rule__StaticQualifier__Group__0");
+					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0(), "rule__JvmTypeReference__Group_0__0");
+					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1(), "rule__JvmTypeReference__Group_0_1__0");
+					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0(), "rule__JvmTypeReference__Group_0_1_0__0");
+					put(grammarAccess.getArrayBracketsAccess().getGroup(), "rule__ArrayBrackets__Group__0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getGroup(), "rule__XFunctionTypeRef__Group__0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0(), "rule__XFunctionTypeRef__Group_0__0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1(), "rule__XFunctionTypeRef__Group_0_1__0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1(), "rule__XFunctionTypeRef__Group_0_1_1__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup(), "rule__JvmParameterizedTypeReference__Group__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1(), "rule__JvmParameterizedTypeReference__Group_1__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2(), "rule__JvmParameterizedTypeReference__Group_1_2__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4(), "rule__JvmParameterizedTypeReference__Group_1_4__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0(), "rule__JvmParameterizedTypeReference__Group_1_4_0__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0(), "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2(), "rule__JvmParameterizedTypeReference__Group_1_4_2__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2(), "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup(), "rule__JvmWildcardTypeReference__Group__0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0(), "rule__JvmWildcardTypeReference__Group_2_0__0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1(), "rule__JvmWildcardTypeReference__Group_2_1__0");
+					put(grammarAccess.getJvmUpperBoundAccess().getGroup(), "rule__JvmUpperBound__Group__0");
+					put(grammarAccess.getJvmUpperBoundAndedAccess().getGroup(), "rule__JvmUpperBoundAnded__Group__0");
+					put(grammarAccess.getJvmLowerBoundAccess().getGroup(), "rule__JvmLowerBound__Group__0");
+					put(grammarAccess.getJvmLowerBoundAndedAccess().getGroup(), "rule__JvmLowerBoundAnded__Group__0");
+					put(grammarAccess.getJvmTypeParameterAccess().getGroup(), "rule__JvmTypeParameter__Group__0");
+					put(grammarAccess.getJvmTypeParameterAccess().getGroup_1(), "rule__JvmTypeParameter__Group_1__0");
+					put(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup(), "rule__QualifiedNameWithWildcard__Group__0");
+					put(grammarAccess.getXImportDeclarationAccess().getGroup(), "rule__XImportDeclaration__Group__0");
+					put(grammarAccess.getXImportDeclarationAccess().getGroup_1_0(), "rule__XImportDeclaration__Group_1_0__0");
+					put(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup(), "rule__QualifiedNameInStaticImport__Group__0");
+					put(grammarAccess.getStatemachineModelAccess().getPackagesAssignment(), "rule__StatemachineModel__PackagesAssignment");
+					put(grammarAccess.getStatemachinePackageAccess().getNameAssignment_2(), "rule__StatemachinePackage__NameAssignment_2");
+					put(grammarAccess.getStatemachinePackageAccess().getImportsAssignment_3_1(), "rule__StatemachinePackage__ImportsAssignment_3_1");
+					put(grammarAccess.getStatemachinePackageAccess().getStatemachinesAssignment_3_2(), "rule__StatemachinePackage__StatemachinesAssignment_3_2");
+					put(grammarAccess.getStatemachineAccess().getNameAssignment_1(), "rule__Statemachine__NameAssignment_1");
+					put(grammarAccess.getStatemachineAccess().getDescriptionAssignment_2_0(), "rule__Statemachine__DescriptionAssignment_2_0");
+					put(grammarAccess.getStatemachineAccess().getDescriptionValueAssignment_2_1(), "rule__Statemachine__DescriptionValueAssignment_2_1");
+					put(grammarAccess.getStatemachineAccess().getFunctionGroupAssignment_3_1(), "rule__Statemachine__FunctionGroupAssignment_3_1");
+					put(grammarAccess.getStatemachineAccess().getInitialStateAssignment_5(), "rule__Statemachine__InitialStateAssignment_5");
+					put(grammarAccess.getStatemachineAccess().getInitialEventAssignment_7(), "rule__Statemachine__InitialEventAssignment_7");
+					put(grammarAccess.getStatemachineAccess().getEventsAssignment_8_1_1(), "rule__Statemachine__EventsAssignment_8_1_1");
+					put(grammarAccess.getStatemachineAccess().getControlsAssignment_9_2(), "rule__Statemachine__ControlsAssignment_9_2");
+					put(grammarAccess.getStatemachineAccess().getStatesAssignment_10_2(), "rule__Statemachine__StatesAssignment_10_2");
+					put(grammarAccess.getStatemachineEventAccess().getNameAssignment_1(), "rule__StatemachineEvent__NameAssignment_1");
+					put(grammarAccess.getStatemachineStateAccess().getNameAssignment_1(), "rule__StatemachineState__NameAssignment_1");
+					put(grammarAccess.getStatemachineStateAccess().getTriggersAssignment_3_0_2(), "rule__StatemachineState__TriggersAssignment_3_0_2");
+					put(grammarAccess.getStatemachineStateAccess().getIdentityAssignment_3_1_1(), "rule__StatemachineState__IdentityAssignment_3_1_1");
+					put(grammarAccess.getStatemachineStateAccess().getKeystrokeAssignment_3_2_2(), "rule__StatemachineState__KeystrokeAssignment_3_2_2");
+					put(grammarAccess.getStatemachineStateAccess().getHasKeyOperationAssignment_3_2_3_0(), "rule__StatemachineState__HasKeyOperationAssignment_3_2_3_0");
+					put(grammarAccess.getStatemachineStateAccess().getKeyOperationAssignment_3_2_3_1(), "rule__StatemachineState__KeyOperationAssignment_3_2_3_1");
+					put(grammarAccess.getStatemachineTriggerAccess().getTriggersAssignment_2(), "rule__StatemachineTrigger__TriggersAssignment_2");
+					put(grammarAccess.getStatemachineTriggerAccess().getGuardsAssignment_3_2(), "rule__StatemachineTrigger__GuardsAssignment_3_2");
+					put(grammarAccess.getStatemachineTriggerAccess().getHasTransitionAssignment_5_0(), "rule__StatemachineTrigger__HasTransitionAssignment_5_0");
+					put(grammarAccess.getStatemachineTriggerAccess().getTransitionAssignment_5_1(), "rule__StatemachineTrigger__TransitionAssignment_5_1");
+					put(grammarAccess.getStatemachineTriggerAccess().getActionsAssignment_7(), "rule__StatemachineTrigger__ActionsAssignment_7");
+					put(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateAssignment_1(), "rule__StatemachineActionPeripheralBlinkRate__BlinkRateAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getDeviceAssignment_3(), "rule__StatemachineActionPeripheralBlinkRate__DeviceAssignment_3");
+					put(grammarAccess.getStatemachineActionPeripheralClearAccess().getDeviceAssignment_1(), "rule__StatemachineActionPeripheralClear__DeviceAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportRowAssignment_2(), "rule__StatemachineActionPeripheralCreateWindow__ViewportRowAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportColumnAssignment_4(), "rule__StatemachineActionPeripheralCreateWindow__ViewportColumnAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportHeightAssignment_6(), "rule__StatemachineActionPeripheralCreateWindow__ViewportHeightAssignment_6");
+					put(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportWidthAssignment_8(), "rule__StatemachineActionPeripheralCreateWindow__ViewportWidthAssignment_8");
+					put(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowHeightAssignment_10(), "rule__StatemachineActionPeripheralCreateWindow__WindowHeightAssignment_10");
+					put(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowWidthAssignment_12(), "rule__StatemachineActionPeripheralCreateWindow__WindowWidthAssignment_12");
+					put(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getDeviceAssignment_14(), "rule__StatemachineActionPeripheralCreateWindow__DeviceAssignment_14");
+					put(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getCursorTypeAssignment_1(), "rule__StatemachineActionPeripheralCursorType__CursorTypeAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getDeviceAssignment_3(), "rule__StatemachineActionPeripheralCursorType__DeviceAssignment_3");
+					put(grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getDeviceAssignment_1(), "rule__StatemachineActionPeripheralDestroyWindow__DeviceAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getBrightnessAssignment_1(), "rule__StatemachineActionPeripheralDeviceBrightness__BrightnessAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getDeviceAssignment_3(), "rule__StatemachineActionPeripheralDeviceBrightness__DeviceAssignment_3");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getBitmapIdAssignment_2(), "rule__StatemachineActionPeripheralDisplayBitmap__BitmapIdAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getDeviceAssignment_4(), "rule__StatemachineActionPeripheralDisplayBitmap__DeviceAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getTextAssignment_2(), "rule__StatemachineActionPeripheralDisplayText__TextAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getHasTypeAssignment_3_0(), "rule__StatemachineActionPeripheralDisplayText__HasTypeAssignment_3_0");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getTextTypeAssignment_3_1(), "rule__StatemachineActionPeripheralDisplayText__TextTypeAssignment_3_1");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getDeviceAssignment_5(), "rule__StatemachineActionPeripheralDisplayText__DeviceAssignment_5");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getTextAssignment_2(), "rule__StatemachineActionPeripheralDisplayTextAt__TextAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getRowAssignment_4(), "rule__StatemachineActionPeripheralDisplayTextAt__RowAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getColumnAssignment_6(), "rule__StatemachineActionPeripheralDisplayTextAt__ColumnAssignment_6");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getHasTypeAssignment_7_0(), "rule__StatemachineActionPeripheralDisplayTextAt__HasTypeAssignment_7_0");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getTextTypeAssignment_7_1(), "rule__StatemachineActionPeripheralDisplayTextAt__TextTypeAssignment_7_1");
+					put(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getDeviceAssignment_9(), "rule__StatemachineActionPeripheralDisplayTextAt__DeviceAssignment_9");
+					put(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getWaitAssignment_1(), "rule__StatemachineActionPeripheralInterCharacterWait__WaitAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getDeviceAssignment_3(), "rule__StatemachineActionPeripheralInterCharacterWait__DeviceAssignment_3");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getFormatAssignment_1(), "rule__StatemachineActionPeripheralMarqueeFormat__FormatAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getDeviceAssignment_3(), "rule__StatemachineActionPeripheralMarqueeFormat__DeviceAssignment_3");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getWaitAssignment_1(), "rule__StatemachineActionPeripheralMarqueeRepeatWait__WaitAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getDeviceAssignment_3(), "rule__StatemachineActionPeripheralMarqueeRepeatWait__DeviceAssignment_3");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getMarqueeTypeAssignment_1(), "rule__StatemachineActionPeripheralMarqueeType__MarqueeTypeAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getDeviceAssignment_3(), "rule__StatemachineActionPeripheralMarqueeType__DeviceAssignment_3");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getWaitAssignment_1(), "rule__StatemachineActionPeripheralMarqueeUnitWait__WaitAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getDeviceAssignment_3(), "rule__StatemachineActionPeripheralMarqueeUnitWait__DeviceAssignment_3");
+					put(grammarAccess.getStatemachineActionPeripheralScrollAccess().getDirectionAssignment_1(), "rule__StatemachineActionPeripheralScroll__DirectionAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralScrollAccess().getUnitsAssignment_2(), "rule__StatemachineActionPeripheralScroll__UnitsAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralScrollAccess().getDeviceAssignment_4(), "rule__StatemachineActionPeripheralScroll__DeviceAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getDeviceAssignment_1(), "rule__StatemachineActionPeripheralOpenDrawer__DeviceAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDataAssignment_2(), "rule__StatemachineActionPeripheralPrintBarcode__DataAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getBarcodeTypeAssignment_4(), "rule__StatemachineActionPeripheralPrintBarcode__BarcodeTypeAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDeviceAssignment_6(), "rule__StatemachineActionPeripheralPrintBarcode__DeviceAssignment_6");
+					put(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getBitmapIdAssignment_2(), "rule__StatemachineActionPeripheralPrintBitmap__BitmapIdAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getDeviceAssignment_4(), "rule__StatemachineActionPeripheralPrintBitmap__DeviceAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getTextAssignment_2(), "rule__StatemachineActionPeripheralPrintCut__TextAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getDeviceAssignment_4(), "rule__StatemachineActionPeripheralPrintCut__DeviceAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getTextAssignment_2(), "rule__StatemachineActionPeripheralPrintNormal__TextAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getDeviceAssignment_4(), "rule__StatemachineActionPeripheralPrintNormal__DeviceAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getBitmapIdAssignment_2(), "rule__StatemachineActionPeripheralPrintRegisterBitmap__BitmapIdAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getNameAssignment_4(), "rule__StatemachineActionPeripheralPrintRegisterBitmap__NameAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getDeviceAssignment_6(), "rule__StatemachineActionPeripheralPrintRegisterBitmap__DeviceAssignment_6");
+					put(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getHostAssignment_2(), "rule__StatemachineActionPeripheralPTOpen__HostAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getPortAssignment_4(), "rule__StatemachineActionPeripheralPTOpen__PortAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getDeviceAssignment_6(), "rule__StatemachineActionPeripheralPTOpen__DeviceAssignment_6");
+					put(grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getDeviceAssignment_2(), "rule__StatemachineActionPeripheralPTClose__DeviceAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getDeviceAssignment_2(), "rule__StatemachineActionPeripheralPTAcknowledge__DeviceAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getPasswordAssignment_2(), "rule__StatemachineActionPeripheralPTReversal__PasswordAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getReceiptAssignment_4(), "rule__StatemachineActionPeripheralPTReversal__ReceiptAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getDeviceAssignment_6(), "rule__StatemachineActionPeripheralPTReversal__DeviceAssignment_6");
+					put(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getPasswordAssignment_2(), "rule__StatemachineActionPeripheralPTRegistration__PasswordAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getConfigurationAssignment_4(), "rule__StatemachineActionPeripheralPTRegistration__ConfigurationAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getDeviceAssignment_6(), "rule__StatemachineActionPeripheralPTRegistration__DeviceAssignment_6");
+					put(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getAmountAssignment_2(), "rule__StatemachineActionPeripheralPTAuthorization__AmountAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getDeviceAssignment_4(), "rule__StatemachineActionPeripheralPTAuthorization__DeviceAssignment_4");
+					put(grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getDeviceAssignment_2(), "rule__StatemachineActionPeripheralPTResponse__DeviceAssignment_2");
+					put(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getReportAssignment_1(), "rule__StatemachineActionPeripheralPrintReport__ReportAssignment_1");
+					put(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getHasFilterAssignment_2_0(), "rule__StatemachineActionPeripheralPrintReport__HasFilterAssignment_2_0");
+					put(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getKeyAssignment_2_1(), "rule__StatemachineActionPeripheralPrintReport__KeyAssignment_2_1");
+					put(grammarAccess.getStatemachineOperationAccess().getOperationAssignment_1(), "rule__StatemachineOperation__OperationAssignment_1");
+					put(grammarAccess.getStatemachineOperationAccess().getFirstAssignment_3(), "rule__StatemachineOperation__FirstAssignment_3");
+					put(grammarAccess.getStatemachineOperationAccess().getMoreAssignment_4(), "rule__StatemachineOperation__MoreAssignment_4");
+					put(grammarAccess.getStatemachineGuardAccess().getGuardAssignment_1(), "rule__StatemachineGuard__GuardAssignment_1");
+					put(grammarAccess.getStatemachineGuardAccess().getHasOnFailAssignment_2_0(), "rule__StatemachineGuard__HasOnFailAssignment_2_0");
+					put(grammarAccess.getStatemachineGuardAccess().getOnFailCaptionAssignment_2_2(), "rule__StatemachineGuard__OnFailCaptionAssignment_2_2");
+					put(grammarAccess.getStatemachineGuardAccess().getOnFailDescriptionAssignment_2_4(), "rule__StatemachineGuard__OnFailDescriptionAssignment_2_4");
+					put(grammarAccess.getStatemachineGuardAccess().getOnFailTypeAssignment_2_6(), "rule__StatemachineGuard__OnFailTypeAssignment_2_6");
+					put(grammarAccess.getStatemachineFunctionAccess().getFunctionAssignment_1(), "rule__StatemachineFunction__FunctionAssignment_1");
+					put(grammarAccess.getStatemachineFunctionAccess().getFirstAssignment_3(), "rule__StatemachineFunction__FirstAssignment_3");
+					put(grammarAccess.getStatemachineFunctionAccess().getMoreAssignment_4(), "rule__StatemachineFunction__MoreAssignment_4");
+					put(grammarAccess.getStatemachineStorageAccess().getContentAssignment_1(), "rule__StatemachineStorage__ContentAssignment_1");
+					put(grammarAccess.getStatemachineStorageAccess().getKeyAssignment_3(), "rule__StatemachineStorage__KeyAssignment_3");
+					put(grammarAccess.getStatemachineStorageAccess().getAttributeAssignment_5(), "rule__StatemachineStorage__AttributeAssignment_5");
+					put(grammarAccess.getStatemachineStorageRetrieveAccess().getKeyAssignment_2(), "rule__StatemachineStorageRetrieve__KeyAssignment_2");
+					put(grammarAccess.getStatemachineStorageRetrieveAccess().getAttributeAssignment_4(), "rule__StatemachineStorageRetrieve__AttributeAssignment_4");
+					put(grammarAccess.getStatemachineActionConditionalTransitionAccess().getTransitionAssignment_1(), "rule__StatemachineActionConditionalTransition__TransitionAssignment_1");
+					put(grammarAccess.getStatemachineActionConditionalTransitionAccess().getGuardAssignment_2(), "rule__StatemachineActionConditionalTransition__GuardAssignment_2");
+					put(grammarAccess.getStatemachineActionConditionalTransitionAccess().getActionsAssignment_4(), "rule__StatemachineActionConditionalTransition__ActionsAssignment_4");
+					put(grammarAccess.getStatemachineActionFieldSourceStringAccess().getTextAssignment(), "rule__StatemachineActionFieldSourceString__TextAssignment");
+					put(grammarAccess.getStatemachineActionFieldSourceNumberAccess().getValueAssignment(), "rule__StatemachineActionFieldSourceNumber__ValueAssignment");
+					put(grammarAccess.getStatemachineActionFieldSourceEvaluateAccess().getEvaluationtypeAssignment(), "rule__StatemachineActionFieldSourceEvaluate__EvaluationtypeAssignment");
+					put(grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getTextAssignment_1(), "rule__StatemachineActionFieldSourceTranslate__TextAssignment_1");
+					put(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getDtoAssignment_1(), "rule__StatemachineActionFieldSourceDtoAttribute__DtoAssignment_1");
+					put(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getAttributeAssignment_3(), "rule__StatemachineActionFieldSourceDtoAttribute__AttributeAssignment_3");
+					put(grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getTextAssignment_2(), "rule__StatemachineActionFieldSourceStringMore__TextAssignment_2");
+					put(grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getValueAssignment_2(), "rule__StatemachineActionFieldSourceNumberMore__ValueAssignment_2");
+					put(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getEvaluationtypeAssignment_2(), "rule__StatemachineActionFieldSourceEvaluateMore__EvaluationtypeAssignment_2");
+					put(grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getTextAssignment_3(), "rule__StatemachineActionFieldSourceTranslateMore__TextAssignment_3");
+					put(grammarAccess.getStatemachineActionFieldGetMoreAccess().getAttributeAssignment_3(), "rule__StatemachineActionFieldGetMore__AttributeAssignment_3");
+					put(grammarAccess.getStatemachineOperationMoreAccess().getOperationAssignment_3(), "rule__StatemachineOperationMore__OperationAssignment_3");
+					put(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getKeyAssignment_4(), "rule__StatemachineStorageRetrieveMore__KeyAssignment_4");
+					put(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getAttributeAssignment_6(), "rule__StatemachineStorageRetrieveMore__AttributeAssignment_6");
+					put(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getDtoAssignment_3(), "rule__StatemachineActionFieldSourceDtoAttributeMore__DtoAssignment_3");
+					put(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getAttributeAssignment_5(), "rule__StatemachineActionFieldSourceDtoAttributeMore__AttributeAssignment_5");
+					put(grammarAccess.getStatemachineActionFieldConcatenationAccess().getFirstAssignment_0(), "rule__StatemachineActionFieldConcatenation__FirstAssignment_0");
+					put(grammarAccess.getStatemachineActionFieldConcatenationAccess().getMoreAssignment_1(), "rule__StatemachineActionFieldConcatenation__MoreAssignment_1");
+					put(grammarAccess.getStatemachineOperationParameterAccess().getSourceAssignment(), "rule__StatemachineOperationParameter__SourceAssignment");
+					put(grammarAccess.getStatemachineOperationParameterMoreAccess().getSourceAssignment_2(), "rule__StatemachineOperationParameterMore__SourceAssignment_2");
+					put(grammarAccess.getStatemachineActionFieldSetAccess().getSourceAssignment_1(), "rule__StatemachineActionFieldSet__SourceAssignment_1");
+					put(grammarAccess.getStatemachineActionFieldSetAccess().getAttributeAssignment_3(), "rule__StatemachineActionFieldSet__AttributeAssignment_3");
+					put(grammarAccess.getStatemachineActionFieldClearAccess().getAttributeAssignment_1(), "rule__StatemachineActionFieldClear__AttributeAssignment_1");
+					put(grammarAccess.getStatemachineActionFieldGetAccess().getAttributeAssignment_1(), "rule__StatemachineActionFieldGet__AttributeAssignment_1");
+					put(grammarAccess.getStatemachineActionFieldRemoveAccess().getAttributeAssignment_1(), "rule__StatemachineActionFieldRemove__AttributeAssignment_1");
+					put(grammarAccess.getStatemachineActionItemVisibleAccess().getAttributeAssignment_1(), "rule__StatemachineActionItemVisible__AttributeAssignment_1");
+					put(grammarAccess.getStatemachineActionItemInvisibleAccess().getAttributeAssignment_1(), "rule__StatemachineActionItemInvisible__AttributeAssignment_1");
+					put(grammarAccess.getStatemachineActionButtonCaptionAccess().getCaptionAssignment_1(), "rule__StatemachineActionButtonCaption__CaptionAssignment_1");
+					put(grammarAccess.getStatemachineActionButtonCaptionAccess().getAttributeAssignment_3(), "rule__StatemachineActionButtonCaption__AttributeAssignment_3");
+					put(grammarAccess.getStatemachineActionButtonImageAccess().getImageAssignment_1(), "rule__StatemachineActionButtonImage__ImageAssignment_1");
+					put(grammarAccess.getStatemachineActionButtonImageAccess().getAttributeAssignment_3(), "rule__StatemachineActionButtonImage__AttributeAssignment_3");
+					put(grammarAccess.getStatemachineActionDTOFindAccess().getSearchAssignment_1(), "rule__StatemachineActionDTOFind__SearchAssignment_1");
+					put(grammarAccess.getStatemachineActionDTOFindAccess().getDtoAssignment_3(), "rule__StatemachineActionDTOFind__DtoAssignment_3");
+					put(grammarAccess.getStatemachineActionDTOFindAccess().getAttributeAssignment_5(), "rule__StatemachineActionDTOFind__AttributeAssignment_5");
+					put(grammarAccess.getStatemachineActionSchedulerAccess().getSchedulerAssignment_1(), "rule__StatemachineActionScheduler__SchedulerAssignment_1");
+					put(grammarAccess.getStatemachineControlButtonAccess().getNameAssignment_1(), "rule__StatemachineControlButton__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlButtonAccess().getEventTypeAssignment_3(), "rule__StatemachineControlButton__EventTypeAssignment_3");
+					put(grammarAccess.getStatemachineControlButtonAccess().getButtonsAssignment_5(), "rule__StatemachineControlButton__ButtonsAssignment_5");
+					put(grammarAccess.getStatemachineControlFieldAccess().getNameAssignment_1(), "rule__StatemachineControlField__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlFieldAccess().getFieldsAssignment_3_0(), "rule__StatemachineControlField__FieldsAssignment_3_0");
+					put(grammarAccess.getStatemachineControlFieldAccess().getLayoutsAssignment_3_1(), "rule__StatemachineControlField__LayoutsAssignment_3_1");
+					put(grammarAccess.getStatemachineControlDTOAccess().getNameAssignment_1(), "rule__StatemachineControlDTO__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlDTOAccess().getDtosAssignment_3(), "rule__StatemachineControlDTO__DtosAssignment_3");
+					put(grammarAccess.getStatemachineControlSchedulerAccess().getNameAssignment_1(), "rule__StatemachineControlScheduler__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlSchedulerAccess().getSchedulersAssignment_3(), "rule__StatemachineControlScheduler__SchedulersAssignment_3");
+					put(grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getNameAssignment_1(), "rule__StatemachinePeripheralDeviceLineDisplay__NameAssignment_1");
+					put(grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getNameAssignment_1(), "rule__StatemachinePeripheralDevicePOSPrinter__NameAssignment_1");
+					put(grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getNameAssignment_1(), "rule__StatemachinePeripheralDeviceCashDrawer__NameAssignment_1");
+					put(grammarAccess.getStatemachinePeripheralDevicePTAccess().getNameAssignment_1(), "rule__StatemachinePeripheralDevicePT__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlPeripheralAccess().getNameAssignment_1(), "rule__StatemachineControlPeripheral__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlPeripheralAccess().getLineDisplaysAssignment_3(), "rule__StatemachineControlPeripheral__LineDisplaysAssignment_3");
+					put(grammarAccess.getStatemachineControlPeripheralAccess().getPosPrintersAssignment_4(), "rule__StatemachineControlPeripheral__PosPrintersAssignment_4");
+					put(grammarAccess.getStatemachineControlPeripheralAccess().getCashDrawersAssignment_5(), "rule__StatemachineControlPeripheral__CashDrawersAssignment_5");
+					put(grammarAccess.getStatemachineControlPeripheralAccess().getPaymentTerminalsAssignment_6(), "rule__StatemachineControlPeripheral__PaymentTerminalsAssignment_6");
+					put(grammarAccess.getStatemachineControlButtonAttributeAccess().getNameAssignment_1(), "rule__StatemachineControlButtonAttribute__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlButtonAttributeAccess().getHasImageAssignment_2_0(), "rule__StatemachineControlButtonAttribute__HasImageAssignment_2_0");
+					put(grammarAccess.getStatemachineControlButtonAttributeAccess().getImageAssignment_2_1(), "rule__StatemachineControlButtonAttribute__ImageAssignment_2_1");
+					put(grammarAccess.getStatemachineControlButtonAttributeAccess().getEventAssignment_3(), "rule__StatemachineControlButtonAttribute__EventAssignment_3");
+					put(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getKeystrokeAssignment_2(), "rule__StatemachineControlButtonAttributeEventKeyboard__KeystrokeAssignment_2");
+					put(grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getIdentityAssignment_2(), "rule__StatemachineControlButtonAttributeEventIdentity__IdentityAssignment_2");
+					put(grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getEventAssignment_2(), "rule__StatemachineControlButtonAttributeEventEvent__EventAssignment_2");
+					put(grammarAccess.getStatemachineControlFieldAttributeAccess().getNameAssignment_1(), "rule__StatemachineControlFieldAttribute__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlFieldAttributeAccess().getAttributeTypeAssignment_3(), "rule__StatemachineControlFieldAttribute__AttributeTypeAssignment_3");
+					put(grammarAccess.getStatemachineControlFieldLayoutAccess().getNameAssignment_1(), "rule__StatemachineControlFieldLayout__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlDTOAttributeAccess().getNameAssignment_1(), "rule__StatemachineControlDTOAttribute__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlDTOAttributeAccess().getAttributeTypeAssignment_3(), "rule__StatemachineControlDTOAttribute__AttributeTypeAssignment_3");
+					put(grammarAccess.getStatemachineControlDTOAttributeAccess().getHasEventAssignment_4_0(), "rule__StatemachineControlDTOAttribute__HasEventAssignment_4_0");
+					put(grammarAccess.getStatemachineControlDTOAttributeAccess().getEventAssignment_4_1(), "rule__StatemachineControlDTOAttribute__EventAssignment_4_1");
+					put(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getNameAssignment_1(), "rule__StatemachineControlSchedulerAttribute__NameAssignment_1");
+					put(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getDelayAssignment_3(), "rule__StatemachineControlSchedulerAttribute__DelayAssignment_3");
+					put(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getEventAssignment_5(), "rule__StatemachineControlSchedulerAttribute__EventAssignment_5");
+					put(grammarAccess.getStatemachineDTOTypeAccess().getAttributeTypeAssignment(), "rule__StatemachineDTOType__AttributeTypeAssignment");
+					put(grammarAccess.getStatemachineFieldTypeAccess().getAttributeTypeAssignment(), "rule__StatemachineFieldType__AttributeTypeAssignment");
+					put(grammarAccess.getStatemachineImportAccess().getImportedNamespaceAssignment_1(), "rule__StatemachineImport__ImportedNamespaceAssignment_1");
+					put(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2(), "rule__XAnnotation__AnnotationTypeAssignment_2");
+					put(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0(), "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0");
+					put(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1(), "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1");
+					put(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1(), "rule__XAnnotation__ValueAssignment_3_1_1");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0(), "rule__XAnnotationElementValuePair__ElementAssignment_0_0_0");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1(), "rule__XAnnotationElementValuePair__ValueAssignment_1");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1");
+					put(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0(), "rule__XAnnotationElementValue__ElementsAssignment_0_1_0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1(), "rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1");
+					put(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1(), "rule__XAssignment__FeatureAssignment_0_1");
+					put(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3(), "rule__XAssignment__ValueAssignment_0_3");
+					put(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1(), "rule__XAssignment__FeatureAssignment_1_1_0_0_1");
+					put(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1(), "rule__XAssignment__RightOperandAssignment_1_1_1");
+					put(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XOrExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1(), "rule__XOrExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XAndExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1(), "rule__XAndExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XEqualityExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1(), "rule__XEqualityExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1(), "rule__XRelationalExpression__TypeAssignment_1_0_1");
+					put(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1(), "rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1");
+					put(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1(), "rule__XRelationalExpression__RightOperandAssignment_1_1_1");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1(), "rule__XOtherOperatorExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XAdditiveExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1(), "rule__XAdditiveExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1(), "rule__XMultiplicativeExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1(), "rule__XUnaryOperation__FeatureAssignment_0_1");
+					put(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2(), "rule__XUnaryOperation__OperandAssignment_0_2");
+					put(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1(), "rule__XCastedExpression__TypeAssignment_1_1");
+					put(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1(), "rule__XPostfixOperation__FeatureAssignment_1_0_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1(), "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2(), "rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2");
+					put(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1(), "rule__XMemberFeatureCall__ValueAssignment_1_0_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1(), "rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2(), "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2");
+					put(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1(), "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1(), "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2(), "rule__XMemberFeatureCall__FeatureAssignment_1_1_2");
+					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0(), "rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4");
+					put(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0(), "rule__XSetLiteral__ElementsAssignment_3_0");
+					put(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1(), "rule__XSetLiteral__ElementsAssignment_3_1_1");
+					put(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0(), "rule__XListLiteral__ElementsAssignment_3_0");
+					put(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1(), "rule__XListLiteral__ElementsAssignment_3_1_1");
+					put(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0(), "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0");
+					put(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1(), "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1");
+					put(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1(), "rule__XClosure__ExplicitSyntaxAssignment_1_0_1");
+					put(grammarAccess.getXClosureAccess().getExpressionAssignment_2(), "rule__XClosure__ExpressionAssignment_2");
+					put(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0(), "rule__XExpressionInClosure__ExpressionsAssignment_1_0");
+					put(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0(), "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0");
+					put(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1(), "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1");
+					put(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2(), "rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2");
+					put(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1(), "rule__XShortClosure__ExpressionAssignment_1");
+					put(grammarAccess.getXIfExpressionAccess().getIfAssignment_3(), "rule__XIfExpression__IfAssignment_3");
+					put(grammarAccess.getXIfExpressionAccess().getThenAssignment_5(), "rule__XIfExpression__ThenAssignment_5");
+					put(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1(), "rule__XIfExpression__ElseAssignment_6_1");
+					put(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1(), "rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1");
+					put(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1(), "rule__XSwitchExpression__SwitchAssignment_2_0_1");
+					put(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0(), "rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0");
+					put(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1(), "rule__XSwitchExpression__SwitchAssignment_2_1_1");
+					put(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4(), "rule__XSwitchExpression__CasesAssignment_4");
+					put(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2(), "rule__XSwitchExpression__DefaultAssignment_5_2");
+					put(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1(), "rule__XCasePart__TypeGuardAssignment_1");
+					put(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1(), "rule__XCasePart__CaseAssignment_2_1");
+					put(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1(), "rule__XCasePart__ThenAssignment_3_0_1");
+					put(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1(), "rule__XCasePart__FallThroughAssignment_3_1");
+					put(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3(), "rule__XForLoopExpression__DeclaredParamAssignment_0_0_3");
+					put(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1(), "rule__XForLoopExpression__ForExpressionAssignment_1");
+					put(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3(), "rule__XForLoopExpression__EachExpressionAssignment_3");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0(), "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1(), "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5(), "rule__XBasicForLoopExpression__ExpressionAssignment_5");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0(), "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1(), "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9(), "rule__XBasicForLoopExpression__EachExpressionAssignment_9");
+					put(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3(), "rule__XWhileExpression__PredicateAssignment_3");
+					put(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5(), "rule__XWhileExpression__BodyAssignment_5");
+					put(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2(), "rule__XDoWhileExpression__BodyAssignment_2");
+					put(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5(), "rule__XDoWhileExpression__PredicateAssignment_5");
+					put(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0(), "rule__XBlockExpression__ExpressionsAssignment_2_0");
+					put(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0(), "rule__XVariableDeclaration__WriteableAssignment_1_0");
+					put(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0(), "rule__XVariableDeclaration__TypeAssignment_2_0_0_0");
+					put(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1(), "rule__XVariableDeclaration__NameAssignment_2_0_0_1");
+					put(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1(), "rule__XVariableDeclaration__NameAssignment_2_1");
+					put(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1(), "rule__XVariableDeclaration__RightAssignment_3_1");
+					put(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0(), "rule__JvmFormalParameter__ParameterTypeAssignment_0");
+					put(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1(), "rule__JvmFormalParameter__NameAssignment_1");
+					put(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0(), "rule__FullJvmFormalParameter__ParameterTypeAssignment_0");
+					put(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1(), "rule__FullJvmFormalParameter__NameAssignment_1");
+					put(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1(), "rule__XFeatureCall__TypeArgumentsAssignment_1_1");
+					put(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1(), "rule__XFeatureCall__TypeArgumentsAssignment_1_2_1");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2(), "rule__XFeatureCall__FeatureAssignment_2");
+					put(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0(), "rule__XFeatureCall__ExplicitOperationCallAssignment_3_0");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_4");
+					put(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2(), "rule__XConstructorCall__ConstructorAssignment_2");
+					put(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1(), "rule__XConstructorCall__TypeArgumentsAssignment_3_1");
+					put(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1(), "rule__XConstructorCall__TypeArgumentsAssignment_3_2_1");
+					put(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0(), "rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0");
+					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0(), "rule__XConstructorCall__ArgumentsAssignment_4_1_0");
+					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0(), "rule__XConstructorCall__ArgumentsAssignment_4_1_1_0");
+					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1(), "rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1");
+					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5(), "rule__XConstructorCall__ArgumentsAssignment_5");
+					put(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1(), "rule__XBooleanLiteral__IsTrueAssignment_1_1");
+					put(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1(), "rule__XNumberLiteral__ValueAssignment_1");
+					put(grammarAccess.getXStringLiteralAccess().getValueAssignment_1(), "rule__XStringLiteral__ValueAssignment_1");
+					put(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3(), "rule__XTypeLiteral__TypeAssignment_3");
+					put(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4(), "rule__XTypeLiteral__ArrayDimensionsAssignment_4");
+					put(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2(), "rule__XThrowExpression__ExpressionAssignment_2");
+					put(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2(), "rule__XReturnExpression__ExpressionAssignment_2");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2(), "rule__XTryCatchFinallyExpression__ExpressionAssignment_2");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0(), "rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1(), "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1(), "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1(), "rule__XSynchronizedExpression__ParamAssignment_1");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3(), "rule__XSynchronizedExpression__ExpressionAssignment_3");
+					put(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2(), "rule__XCatchClause__DeclaredParamAssignment_2");
+					put(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4(), "rule__XCatchClause__ExpressionAssignment_4");
+					put(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0(), "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1(), "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1");
+					put(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2(), "rule__XFunctionTypeRef__ReturnTypeAssignment_2");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0(), "rule__JvmParameterizedTypeReference__TypeAssignment_0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1(), "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1");
+					put(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1(), "rule__JvmUpperBound__TypeReferenceAssignment_1");
+					put(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1(), "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1");
+					put(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1(), "rule__JvmLowerBound__TypeReferenceAssignment_1");
+					put(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1(), "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1");
+					put(grammarAccess.getJvmTypeParameterAccess().getNameAssignment_0(), "rule__JvmTypeParameter__NameAssignment_0");
+					put(grammarAccess.getJvmTypeParameterAccess().getConstraintsAssignment_1_0(), "rule__JvmTypeParameter__ConstraintsAssignment_1_0");
+					put(grammarAccess.getJvmTypeParameterAccess().getConstraintsAssignment_1_1(), "rule__JvmTypeParameter__ConstraintsAssignment_1_1");
+					put(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment(), "rule__XImportSection__ImportDeclarationsAssignment");
+					put(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_1_0_0(), "rule__XImportDeclaration__StaticAssignment_1_0_0");
+					put(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_1_0_1(), "rule__XImportDeclaration__ExtensionAssignment_1_0_1");
+					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_0_2(), "rule__XImportDeclaration__ImportedTypeAssignment_1_0_2");
+					put(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0(), "rule__XImportDeclaration__WildcardAssignment_1_0_3_0");
+					put(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1(), "rule__XImportDeclaration__MemberNameAssignment_1_0_3_1");
+					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1(), "rule__XImportDeclaration__ImportedTypeAssignment_1_1");
+					put(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2(), "rule__XImportDeclaration__ImportedNamespaceAssignment_1_2");
+					put(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), "rule__StatemachineState__UnorderedGroup_3");
+					put(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3(), "rule__StatemachineControlField__UnorderedGroup_3");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+	
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		try {
+			org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr.internal.InternalStatemachineDSLParser typedParser = (org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr.internal.InternalStatemachineDSLParser) parser;
+			typedParser.entryRuleStatemachineModel();
+			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 StatemachineDSLGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+	
+	public void setGrammarAccess(StatemachineDSLGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g
new file mode 100644
index 0000000..09ffb65
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g
@@ -0,0 +1,10014 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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 InternalStatemachineDSL;
+
+options {
+	superClass=AbstractInternalContentAssistParser;
+	backtrack=true;
+	
+}
+
+@lexer::header {
+package org.eclipse.osbp.xtext.statemachine.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.statemachine.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.statemachine.services.StatemachineDSLGrammarAccess;
+
+}
+
+@parser::members {
+ 
+ 	private StatemachineDSLGrammarAccess grammarAccess;
+ 	
+    public void setGrammarAccess(StatemachineDSLGrammarAccess grammarAccess) {
+    	this.grammarAccess = grammarAccess;
+    }
+    
+    @Override
+    protected Grammar getGrammar() {
+    	return grammarAccess.getGrammar();
+    }
+    
+    @Override
+    protected String getValueForTokenName(String tokenName) {
+    	return tokenName;
+    }
+
+}
+
+
+
+
+// Entry rule entryRuleStatemachineModel
+entryRuleStatemachineModel 
+:
+{ before(grammarAccess.getStatemachineModelRule()); }
+	 ruleStatemachineModel
+{ after(grammarAccess.getStatemachineModelRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineModel
+ruleStatemachineModel
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineModelAccess().getPackagesAssignment()); }
+(rule__StatemachineModel__PackagesAssignment)*
+{ after(grammarAccess.getStatemachineModelAccess().getPackagesAssignment()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachinePackage
+entryRuleStatemachinePackage 
+:
+{ before(grammarAccess.getStatemachinePackageRule()); }
+	 ruleStatemachinePackage
+{ after(grammarAccess.getStatemachinePackageRule()); } 
+	 EOF 
+;
+
+// Rule StatemachinePackage
+ruleStatemachinePackage
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getGroup()); }
+(rule__StatemachinePackage__Group__0)
+{ after(grammarAccess.getStatemachinePackageAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachine
+entryRuleStatemachine 
+:
+{ before(grammarAccess.getStatemachineRule()); }
+	 ruleStatemachine
+{ after(grammarAccess.getStatemachineRule()); } 
+	 EOF 
+;
+
+// Rule Statemachine
+ruleStatemachine
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineAccess().getGroup()); }
+(rule__Statemachine__Group__0)
+{ after(grammarAccess.getStatemachineAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineEvent
+entryRuleStatemachineEvent 
+:
+{ before(grammarAccess.getStatemachineEventRule()); }
+	 ruleStatemachineEvent
+{ after(grammarAccess.getStatemachineEventRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineEvent
+ruleStatemachineEvent
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineEventAccess().getGroup()); }
+(rule__StatemachineEvent__Group__0)
+{ after(grammarAccess.getStatemachineEventAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineState
+entryRuleStatemachineState 
+:
+{ before(grammarAccess.getStatemachineStateRule()); }
+	 ruleStatemachineState
+{ after(grammarAccess.getStatemachineStateRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineState
+ruleStatemachineState
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getGroup()); }
+(rule__StatemachineState__Group__0)
+{ after(grammarAccess.getStatemachineStateAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineTrigger
+entryRuleStatemachineTrigger 
+:
+{ before(grammarAccess.getStatemachineTriggerRule()); }
+	 ruleStatemachineTrigger
+{ after(grammarAccess.getStatemachineTriggerRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineTrigger
+ruleStatemachineTrigger
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getGroup()); }
+(rule__StatemachineTrigger__Group__0)
+{ after(grammarAccess.getStatemachineTriggerAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineAction
+entryRuleStatemachineAction 
+:
+{ before(grammarAccess.getStatemachineActionRule()); }
+	 ruleStatemachineAction
+{ after(grammarAccess.getStatemachineActionRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineAction
+ruleStatemachineAction
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionAccess().getAlternatives()); }
+(rule__StatemachineAction__Alternatives)
+{ after(grammarAccess.getStatemachineActionAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralBlinkRate
+entryRuleStatemachineActionPeripheralBlinkRate 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralBlinkRateRule()); }
+	 ruleStatemachineActionPeripheralBlinkRate
+{ after(grammarAccess.getStatemachineActionPeripheralBlinkRateRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralBlinkRate
+ruleStatemachineActionPeripheralBlinkRate
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getGroup()); }
+(rule__StatemachineActionPeripheralBlinkRate__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralClear
+entryRuleStatemachineActionPeripheralClear 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralClearRule()); }
+	 ruleStatemachineActionPeripheralClear
+{ after(grammarAccess.getStatemachineActionPeripheralClearRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralClear
+ruleStatemachineActionPeripheralClear
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralClearAccess().getGroup()); }
+(rule__StatemachineActionPeripheralClear__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralClearAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralCreateWindow
+entryRuleStatemachineActionPeripheralCreateWindow 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralCreateWindowRule()); }
+	 ruleStatemachineActionPeripheralCreateWindow
+{ after(grammarAccess.getStatemachineActionPeripheralCreateWindowRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralCreateWindow
+ruleStatemachineActionPeripheralCreateWindow
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getGroup()); }
+(rule__StatemachineActionPeripheralCreateWindow__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralCursorType
+entryRuleStatemachineActionPeripheralCursorType 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralCursorTypeRule()); }
+	 ruleStatemachineActionPeripheralCursorType
+{ after(grammarAccess.getStatemachineActionPeripheralCursorTypeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralCursorType
+ruleStatemachineActionPeripheralCursorType
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getGroup()); }
+(rule__StatemachineActionPeripheralCursorType__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDestroyWindow
+entryRuleStatemachineActionPeripheralDestroyWindow 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralDestroyWindowRule()); }
+	 ruleStatemachineActionPeripheralDestroyWindow
+{ after(grammarAccess.getStatemachineActionPeripheralDestroyWindowRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDestroyWindow
+ruleStatemachineActionPeripheralDestroyWindow
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getGroup()); }
+(rule__StatemachineActionPeripheralDestroyWindow__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDeviceBrightness
+entryRuleStatemachineActionPeripheralDeviceBrightness 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule()); }
+	 ruleStatemachineActionPeripheralDeviceBrightness
+{ after(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDeviceBrightness
+ruleStatemachineActionPeripheralDeviceBrightness
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getGroup()); }
+(rule__StatemachineActionPeripheralDeviceBrightness__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDisplayBitmap
+entryRuleStatemachineActionPeripheralDisplayBitmap 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule()); }
+	 ruleStatemachineActionPeripheralDisplayBitmap
+{ after(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDisplayBitmap
+ruleStatemachineActionPeripheralDisplayBitmap
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getGroup()); }
+(rule__StatemachineActionPeripheralDisplayBitmap__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDisplayText
+entryRuleStatemachineActionPeripheralDisplayText 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralDisplayTextRule()); }
+	 ruleStatemachineActionPeripheralDisplayText
+{ after(grammarAccess.getStatemachineActionPeripheralDisplayTextRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDisplayText
+ruleStatemachineActionPeripheralDisplayText
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getGroup()); }
+(rule__StatemachineActionPeripheralDisplayText__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDisplayTextAt
+entryRuleStatemachineActionPeripheralDisplayTextAt 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule()); }
+	 ruleStatemachineActionPeripheralDisplayTextAt
+{ after(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDisplayTextAt
+ruleStatemachineActionPeripheralDisplayTextAt
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getGroup()); }
+(rule__StatemachineActionPeripheralDisplayTextAt__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralInterCharacterWait
+entryRuleStatemachineActionPeripheralInterCharacterWait 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule()); }
+	 ruleStatemachineActionPeripheralInterCharacterWait
+{ after(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralInterCharacterWait
+ruleStatemachineActionPeripheralInterCharacterWait
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getGroup()); }
+(rule__StatemachineActionPeripheralInterCharacterWait__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralMarqueeFormat
+entryRuleStatemachineActionPeripheralMarqueeFormat 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule()); }
+	 ruleStatemachineActionPeripheralMarqueeFormat
+{ after(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralMarqueeFormat
+ruleStatemachineActionPeripheralMarqueeFormat
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getGroup()); }
+(rule__StatemachineActionPeripheralMarqueeFormat__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralMarqueeRepeatWait
+entryRuleStatemachineActionPeripheralMarqueeRepeatWait 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule()); }
+	 ruleStatemachineActionPeripheralMarqueeRepeatWait
+{ after(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralMarqueeRepeatWait
+ruleStatemachineActionPeripheralMarqueeRepeatWait
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getGroup()); }
+(rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralMarqueeType
+entryRuleStatemachineActionPeripheralMarqueeType 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule()); }
+	 ruleStatemachineActionPeripheralMarqueeType
+{ after(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralMarqueeType
+ruleStatemachineActionPeripheralMarqueeType
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getGroup()); }
+(rule__StatemachineActionPeripheralMarqueeType__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralMarqueeUnitWait
+entryRuleStatemachineActionPeripheralMarqueeUnitWait 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule()); }
+	 ruleStatemachineActionPeripheralMarqueeUnitWait
+{ after(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralMarqueeUnitWait
+ruleStatemachineActionPeripheralMarqueeUnitWait
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getGroup()); }
+(rule__StatemachineActionPeripheralMarqueeUnitWait__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralScroll
+entryRuleStatemachineActionPeripheralScroll 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralScrollRule()); }
+	 ruleStatemachineActionPeripheralScroll
+{ after(grammarAccess.getStatemachineActionPeripheralScrollRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralScroll
+ruleStatemachineActionPeripheralScroll
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralScrollAccess().getGroup()); }
+(rule__StatemachineActionPeripheralScroll__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralScrollAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralOpenDrawer
+entryRuleStatemachineActionPeripheralOpenDrawer 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralOpenDrawerRule()); }
+	 ruleStatemachineActionPeripheralOpenDrawer
+{ after(grammarAccess.getStatemachineActionPeripheralOpenDrawerRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralOpenDrawer
+ruleStatemachineActionPeripheralOpenDrawer
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getGroup()); }
+(rule__StatemachineActionPeripheralOpenDrawer__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintBarcode
+entryRuleStatemachineActionPeripheralPrintBarcode 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule()); }
+	 ruleStatemachineActionPeripheralPrintBarcode
+{ after(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintBarcode
+ruleStatemachineActionPeripheralPrintBarcode
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPrintBarcode__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintBitmap
+entryRuleStatemachineActionPeripheralPrintBitmap 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule()); }
+	 ruleStatemachineActionPeripheralPrintBitmap
+{ after(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintBitmap
+ruleStatemachineActionPeripheralPrintBitmap
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPrintBitmap__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintCut
+entryRuleStatemachineActionPeripheralPrintCut 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPrintCutRule()); }
+	 ruleStatemachineActionPeripheralPrintCut
+{ after(grammarAccess.getStatemachineActionPeripheralPrintCutRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintCut
+ruleStatemachineActionPeripheralPrintCut
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPrintCut__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintNormal
+entryRuleStatemachineActionPeripheralPrintNormal 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPrintNormalRule()); }
+	 ruleStatemachineActionPeripheralPrintNormal
+{ after(grammarAccess.getStatemachineActionPeripheralPrintNormalRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintNormal
+ruleStatemachineActionPeripheralPrintNormal
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPrintNormal__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintRegisterBitmap
+entryRuleStatemachineActionPeripheralPrintRegisterBitmap 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule()); }
+	 ruleStatemachineActionPeripheralPrintRegisterBitmap
+{ after(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintRegisterBitmap
+ruleStatemachineActionPeripheralPrintRegisterBitmap
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTOpen
+entryRuleStatemachineActionPeripheralPTOpen 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPTOpenRule()); }
+	 ruleStatemachineActionPeripheralPTOpen
+{ after(grammarAccess.getStatemachineActionPeripheralPTOpenRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTOpen
+ruleStatemachineActionPeripheralPTOpen
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPTOpen__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTClose
+entryRuleStatemachineActionPeripheralPTClose 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPTCloseRule()); }
+	 ruleStatemachineActionPeripheralPTClose
+{ after(grammarAccess.getStatemachineActionPeripheralPTCloseRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTClose
+ruleStatemachineActionPeripheralPTClose
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPTClose__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTAcknowledge
+entryRuleStatemachineActionPeripheralPTAcknowledge 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule()); }
+	 ruleStatemachineActionPeripheralPTAcknowledge
+{ after(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTAcknowledge
+ruleStatemachineActionPeripheralPTAcknowledge
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPTAcknowledge__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTReversal
+entryRuleStatemachineActionPeripheralPTReversal 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPTReversalRule()); }
+	 ruleStatemachineActionPeripheralPTReversal
+{ after(grammarAccess.getStatemachineActionPeripheralPTReversalRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTReversal
+ruleStatemachineActionPeripheralPTReversal
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPTReversal__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTRegistration
+entryRuleStatemachineActionPeripheralPTRegistration 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule()); }
+	 ruleStatemachineActionPeripheralPTRegistration
+{ after(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTRegistration
+ruleStatemachineActionPeripheralPTRegistration
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPTRegistration__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTAuthorization
+entryRuleStatemachineActionPeripheralPTAuthorization 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule()); }
+	 ruleStatemachineActionPeripheralPTAuthorization
+{ after(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTAuthorization
+ruleStatemachineActionPeripheralPTAuthorization
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPTAuthorization__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTResponse
+entryRuleStatemachineActionPeripheralPTResponse 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPTResponseRule()); }
+	 ruleStatemachineActionPeripheralPTResponse
+{ after(grammarAccess.getStatemachineActionPeripheralPTResponseRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTResponse
+ruleStatemachineActionPeripheralPTResponse
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPTResponse__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintReport
+entryRuleStatemachineActionPeripheralPrintReport 
+:
+{ before(grammarAccess.getStatemachineActionPeripheralPrintReportRule()); }
+	 ruleStatemachineActionPeripheralPrintReport
+{ after(grammarAccess.getStatemachineActionPeripheralPrintReportRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintReport
+ruleStatemachineActionPeripheralPrintReport
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getGroup()); }
+(rule__StatemachineActionPeripheralPrintReport__Group__0)
+{ after(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSource
+entryRuleStatemachineActionFieldSource 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceRule()); }
+	 ruleStatemachineActionFieldSource
+{ after(grammarAccess.getStatemachineActionFieldSourceRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSource
+ruleStatemachineActionFieldSource
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getAlternatives()); }
+(rule__StatemachineActionFieldSource__Alternatives)
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineOperation
+entryRuleStatemachineOperation 
+:
+{ before(grammarAccess.getStatemachineOperationRule()); }
+	 ruleStatemachineOperation
+{ after(grammarAccess.getStatemachineOperationRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineOperation
+ruleStatemachineOperation
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineOperationAccess().getGroup()); }
+(rule__StatemachineOperation__Group__0)
+{ after(grammarAccess.getStatemachineOperationAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineGuard
+entryRuleStatemachineGuard 
+:
+{ before(grammarAccess.getStatemachineGuardRule()); }
+	 ruleStatemachineGuard
+{ after(grammarAccess.getStatemachineGuardRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineGuard
+ruleStatemachineGuard
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineGuardAccess().getGroup()); }
+(rule__StatemachineGuard__Group__0)
+{ after(grammarAccess.getStatemachineGuardAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineFunction
+entryRuleStatemachineFunction 
+:
+{ before(grammarAccess.getStatemachineFunctionRule()); }
+	 ruleStatemachineFunction
+{ after(grammarAccess.getStatemachineFunctionRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineFunction
+ruleStatemachineFunction
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineFunctionAccess().getGroup()); }
+(rule__StatemachineFunction__Group__0)
+{ after(grammarAccess.getStatemachineFunctionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineStorage
+entryRuleStatemachineStorage 
+:
+{ before(grammarAccess.getStatemachineStorageRule()); }
+	 ruleStatemachineStorage
+{ after(grammarAccess.getStatemachineStorageRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineStorage
+ruleStatemachineStorage
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineStorageAccess().getGroup()); }
+(rule__StatemachineStorage__Group__0)
+{ after(grammarAccess.getStatemachineStorageAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineStorageRetrieve
+entryRuleStatemachineStorageRetrieve 
+:
+{ before(grammarAccess.getStatemachineStorageRetrieveRule()); }
+	 ruleStatemachineStorageRetrieve
+{ after(grammarAccess.getStatemachineStorageRetrieveRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineStorageRetrieve
+ruleStatemachineStorageRetrieve
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineStorageRetrieveAccess().getGroup()); }
+(rule__StatemachineStorageRetrieve__Group__0)
+{ after(grammarAccess.getStatemachineStorageRetrieveAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionConditionalTransition
+entryRuleStatemachineActionConditionalTransition 
+:
+{ before(grammarAccess.getStatemachineActionConditionalTransitionRule()); }
+	 ruleStatemachineActionConditionalTransition
+{ after(grammarAccess.getStatemachineActionConditionalTransitionRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionConditionalTransition
+ruleStatemachineActionConditionalTransition
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionConditionalTransitionAccess().getGroup()); }
+(rule__StatemachineActionConditionalTransition__Group__0)
+{ after(grammarAccess.getStatemachineActionConditionalTransitionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceString
+entryRuleStatemachineActionFieldSourceString 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceStringRule()); }
+	 ruleStatemachineActionFieldSourceString
+{ after(grammarAccess.getStatemachineActionFieldSourceStringRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceString
+ruleStatemachineActionFieldSourceString
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceStringAccess().getTextAssignment()); }
+(rule__StatemachineActionFieldSourceString__TextAssignment)
+{ after(grammarAccess.getStatemachineActionFieldSourceStringAccess().getTextAssignment()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceNumber
+entryRuleStatemachineActionFieldSourceNumber 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceNumberRule()); }
+	 ruleStatemachineActionFieldSourceNumber
+{ after(grammarAccess.getStatemachineActionFieldSourceNumberRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceNumber
+ruleStatemachineActionFieldSourceNumber
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceNumberAccess().getValueAssignment()); }
+(rule__StatemachineActionFieldSourceNumber__ValueAssignment)
+{ after(grammarAccess.getStatemachineActionFieldSourceNumberAccess().getValueAssignment()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceEvaluate
+entryRuleStatemachineActionFieldSourceEvaluate 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceEvaluateRule()); }
+	 ruleStatemachineActionFieldSourceEvaluate
+{ after(grammarAccess.getStatemachineActionFieldSourceEvaluateRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceEvaluate
+ruleStatemachineActionFieldSourceEvaluate
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceEvaluateAccess().getEvaluationtypeAssignment()); }
+(rule__StatemachineActionFieldSourceEvaluate__EvaluationtypeAssignment)
+{ after(grammarAccess.getStatemachineActionFieldSourceEvaluateAccess().getEvaluationtypeAssignment()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceEvent
+entryRuleStatemachineActionFieldSourceEvent 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceEventRule()); }
+	 ruleStatemachineActionFieldSourceEvent
+{ after(grammarAccess.getStatemachineActionFieldSourceEventRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceEvent
+ruleStatemachineActionFieldSourceEvent
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceEventAccess().getGroup()); }
+(rule__StatemachineActionFieldSourceEvent__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSourceEventAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceTranslate
+entryRuleStatemachineActionFieldSourceTranslate 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceTranslateRule()); }
+	 ruleStatemachineActionFieldSourceTranslate
+{ after(grammarAccess.getStatemachineActionFieldSourceTranslateRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceTranslate
+ruleStatemachineActionFieldSourceTranslate
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getGroup()); }
+(rule__StatemachineActionFieldSourceTranslate__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceDtoAttribute
+entryRuleStatemachineActionFieldSourceDtoAttribute 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceDtoAttributeRule()); }
+	 ruleStatemachineActionFieldSourceDtoAttribute
+{ after(grammarAccess.getStatemachineActionFieldSourceDtoAttributeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceDtoAttribute
+ruleStatemachineActionFieldSourceDtoAttribute
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getGroup()); }
+(rule__StatemachineActionFieldSourceDtoAttribute__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceMore
+entryRuleStatemachineActionFieldSourceMore 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreRule()); }
+	 ruleStatemachineActionFieldSourceMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceMore
+ruleStatemachineActionFieldSourceMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getAlternatives()); }
+(rule__StatemachineActionFieldSourceMore__Alternatives)
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceStringMore
+entryRuleStatemachineActionFieldSourceStringMore 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceStringMoreRule()); }
+	 ruleStatemachineActionFieldSourceStringMore
+{ after(grammarAccess.getStatemachineActionFieldSourceStringMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceStringMore
+ruleStatemachineActionFieldSourceStringMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getGroup()); }
+(rule__StatemachineActionFieldSourceStringMore__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceNumberMore
+entryRuleStatemachineActionFieldSourceNumberMore 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceNumberMoreRule()); }
+	 ruleStatemachineActionFieldSourceNumberMore
+{ after(grammarAccess.getStatemachineActionFieldSourceNumberMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceNumberMore
+ruleStatemachineActionFieldSourceNumberMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getGroup()); }
+(rule__StatemachineActionFieldSourceNumberMore__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceEvaluateMore
+entryRuleStatemachineActionFieldSourceEvaluateMore 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreRule()); }
+	 ruleStatemachineActionFieldSourceEvaluateMore
+{ after(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceEvaluateMore
+ruleStatemachineActionFieldSourceEvaluateMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getGroup()); }
+(rule__StatemachineActionFieldSourceEvaluateMore__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceTranslateMore
+entryRuleStatemachineActionFieldSourceTranslateMore 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceTranslateMoreRule()); }
+	 ruleStatemachineActionFieldSourceTranslateMore
+{ after(grammarAccess.getStatemachineActionFieldSourceTranslateMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceTranslateMore
+ruleStatemachineActionFieldSourceTranslateMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getGroup()); }
+(rule__StatemachineActionFieldSourceTranslateMore__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldGetMore
+entryRuleStatemachineActionFieldGetMore 
+:
+{ before(grammarAccess.getStatemachineActionFieldGetMoreRule()); }
+	 ruleStatemachineActionFieldGetMore
+{ after(grammarAccess.getStatemachineActionFieldGetMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldGetMore
+ruleStatemachineActionFieldGetMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldGetMoreAccess().getGroup()); }
+(rule__StatemachineActionFieldGetMore__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldGetMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineOperationMore
+entryRuleStatemachineOperationMore 
+:
+{ before(grammarAccess.getStatemachineOperationMoreRule()); }
+	 ruleStatemachineOperationMore
+{ after(grammarAccess.getStatemachineOperationMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineOperationMore
+ruleStatemachineOperationMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineOperationMoreAccess().getGroup()); }
+(rule__StatemachineOperationMore__Group__0)
+{ after(grammarAccess.getStatemachineOperationMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineStorageRetrieveMore
+entryRuleStatemachineStorageRetrieveMore 
+:
+{ before(grammarAccess.getStatemachineStorageRetrieveMoreRule()); }
+	 ruleStatemachineStorageRetrieveMore
+{ after(grammarAccess.getStatemachineStorageRetrieveMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineStorageRetrieveMore
+ruleStatemachineStorageRetrieveMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getGroup()); }
+(rule__StatemachineStorageRetrieveMore__Group__0)
+{ after(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceDtoAttributeMore
+entryRuleStatemachineActionFieldSourceDtoAttributeMore 
+:
+{ before(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreRule()); }
+	 ruleStatemachineActionFieldSourceDtoAttributeMore
+{ after(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceDtoAttributeMore
+ruleStatemachineActionFieldSourceDtoAttributeMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getGroup()); }
+(rule__StatemachineActionFieldSourceDtoAttributeMore__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldConcatenation
+entryRuleStatemachineActionFieldConcatenation 
+:
+{ before(grammarAccess.getStatemachineActionFieldConcatenationRule()); }
+	 ruleStatemachineActionFieldConcatenation
+{ after(grammarAccess.getStatemachineActionFieldConcatenationRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldConcatenation
+ruleStatemachineActionFieldConcatenation
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldConcatenationAccess().getGroup()); }
+(rule__StatemachineActionFieldConcatenation__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldConcatenationAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineOperationParameter
+entryRuleStatemachineOperationParameter 
+:
+{ before(grammarAccess.getStatemachineOperationParameterRule()); }
+	 ruleStatemachineOperationParameter
+{ after(grammarAccess.getStatemachineOperationParameterRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineOperationParameter
+ruleStatemachineOperationParameter
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineOperationParameterAccess().getSourceAssignment()); }
+(rule__StatemachineOperationParameter__SourceAssignment)
+{ after(grammarAccess.getStatemachineOperationParameterAccess().getSourceAssignment()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineOperationParameterMore
+entryRuleStatemachineOperationParameterMore 
+:
+{ before(grammarAccess.getStatemachineOperationParameterMoreRule()); }
+	 ruleStatemachineOperationParameterMore
+{ after(grammarAccess.getStatemachineOperationParameterMoreRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineOperationParameterMore
+ruleStatemachineOperationParameterMore
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineOperationParameterMoreAccess().getGroup()); }
+(rule__StatemachineOperationParameterMore__Group__0)
+{ after(grammarAccess.getStatemachineOperationParameterMoreAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSet
+entryRuleStatemachineActionFieldSet 
+:
+{ before(grammarAccess.getStatemachineActionFieldSetRule()); }
+	 ruleStatemachineActionFieldSet
+{ after(grammarAccess.getStatemachineActionFieldSetRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSet
+ruleStatemachineActionFieldSet
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldSetAccess().getGroup()); }
+(rule__StatemachineActionFieldSet__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldSetAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldClear
+entryRuleStatemachineActionFieldClear 
+:
+{ before(grammarAccess.getStatemachineActionFieldClearRule()); }
+	 ruleStatemachineActionFieldClear
+{ after(grammarAccess.getStatemachineActionFieldClearRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldClear
+ruleStatemachineActionFieldClear
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldClearAccess().getGroup()); }
+(rule__StatemachineActionFieldClear__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldClearAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldGet
+entryRuleStatemachineActionFieldGet 
+:
+{ before(grammarAccess.getStatemachineActionFieldGetRule()); }
+	 ruleStatemachineActionFieldGet
+{ after(grammarAccess.getStatemachineActionFieldGetRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldGet
+ruleStatemachineActionFieldGet
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldGetAccess().getGroup()); }
+(rule__StatemachineActionFieldGet__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldGetAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionFieldRemove
+entryRuleStatemachineActionFieldRemove 
+:
+{ before(grammarAccess.getStatemachineActionFieldRemoveRule()); }
+	 ruleStatemachineActionFieldRemove
+{ after(grammarAccess.getStatemachineActionFieldRemoveRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldRemove
+ruleStatemachineActionFieldRemove
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionFieldRemoveAccess().getGroup()); }
+(rule__StatemachineActionFieldRemove__Group__0)
+{ after(grammarAccess.getStatemachineActionFieldRemoveAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionItemVisible
+entryRuleStatemachineActionItemVisible 
+:
+{ before(grammarAccess.getStatemachineActionItemVisibleRule()); }
+	 ruleStatemachineActionItemVisible
+{ after(grammarAccess.getStatemachineActionItemVisibleRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionItemVisible
+ruleStatemachineActionItemVisible
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionItemVisibleAccess().getGroup()); }
+(rule__StatemachineActionItemVisible__Group__0)
+{ after(grammarAccess.getStatemachineActionItemVisibleAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionItemInvisible
+entryRuleStatemachineActionItemInvisible 
+:
+{ before(grammarAccess.getStatemachineActionItemInvisibleRule()); }
+	 ruleStatemachineActionItemInvisible
+{ after(grammarAccess.getStatemachineActionItemInvisibleRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionItemInvisible
+ruleStatemachineActionItemInvisible
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionItemInvisibleAccess().getGroup()); }
+(rule__StatemachineActionItemInvisible__Group__0)
+{ after(grammarAccess.getStatemachineActionItemInvisibleAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionButtonCaption
+entryRuleStatemachineActionButtonCaption 
+:
+{ before(grammarAccess.getStatemachineActionButtonCaptionRule()); }
+	 ruleStatemachineActionButtonCaption
+{ after(grammarAccess.getStatemachineActionButtonCaptionRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionButtonCaption
+ruleStatemachineActionButtonCaption
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionButtonCaptionAccess().getGroup()); }
+(rule__StatemachineActionButtonCaption__Group__0)
+{ after(grammarAccess.getStatemachineActionButtonCaptionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionButtonImage
+entryRuleStatemachineActionButtonImage 
+:
+{ before(grammarAccess.getStatemachineActionButtonImageRule()); }
+	 ruleStatemachineActionButtonImage
+{ after(grammarAccess.getStatemachineActionButtonImageRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionButtonImage
+ruleStatemachineActionButtonImage
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionButtonImageAccess().getGroup()); }
+(rule__StatemachineActionButtonImage__Group__0)
+{ after(grammarAccess.getStatemachineActionButtonImageAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionDTOFind
+entryRuleStatemachineActionDTOFind 
+:
+{ before(grammarAccess.getStatemachineActionDTOFindRule()); }
+	 ruleStatemachineActionDTOFind
+{ after(grammarAccess.getStatemachineActionDTOFindRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionDTOFind
+ruleStatemachineActionDTOFind
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionDTOFindAccess().getGroup()); }
+(rule__StatemachineActionDTOFind__Group__0)
+{ after(grammarAccess.getStatemachineActionDTOFindAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineActionScheduler
+entryRuleStatemachineActionScheduler 
+:
+{ before(grammarAccess.getStatemachineActionSchedulerRule()); }
+	 ruleStatemachineActionScheduler
+{ after(grammarAccess.getStatemachineActionSchedulerRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineActionScheduler
+ruleStatemachineActionScheduler
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineActionSchedulerAccess().getGroup()); }
+(rule__StatemachineActionScheduler__Group__0)
+{ after(grammarAccess.getStatemachineActionSchedulerAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControl
+entryRuleStatemachineControl 
+:
+{ before(grammarAccess.getStatemachineControlRule()); }
+	 ruleStatemachineControl
+{ after(grammarAccess.getStatemachineControlRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControl
+ruleStatemachineControl
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlAccess().getAlternatives()); }
+(rule__StatemachineControl__Alternatives)
+{ after(grammarAccess.getStatemachineControlAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlButton
+entryRuleStatemachineControlButton 
+:
+{ before(grammarAccess.getStatemachineControlButtonRule()); }
+	 ruleStatemachineControlButton
+{ after(grammarAccess.getStatemachineControlButtonRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlButton
+ruleStatemachineControlButton
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlButtonAccess().getGroup()); }
+(rule__StatemachineControlButton__Group__0)
+{ after(grammarAccess.getStatemachineControlButtonAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlField
+entryRuleStatemachineControlField 
+:
+{ before(grammarAccess.getStatemachineControlFieldRule()); }
+	 ruleStatemachineControlField
+{ after(grammarAccess.getStatemachineControlFieldRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlField
+ruleStatemachineControlField
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlFieldAccess().getGroup()); }
+(rule__StatemachineControlField__Group__0)
+{ after(grammarAccess.getStatemachineControlFieldAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlDTO
+entryRuleStatemachineControlDTO 
+:
+{ before(grammarAccess.getStatemachineControlDTORule()); }
+	 ruleStatemachineControlDTO
+{ after(grammarAccess.getStatemachineControlDTORule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlDTO
+ruleStatemachineControlDTO
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlDTOAccess().getGroup()); }
+(rule__StatemachineControlDTO__Group__0)
+{ after(grammarAccess.getStatemachineControlDTOAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlScheduler
+entryRuleStatemachineControlScheduler 
+:
+{ before(grammarAccess.getStatemachineControlSchedulerRule()); }
+	 ruleStatemachineControlScheduler
+{ after(grammarAccess.getStatemachineControlSchedulerRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlScheduler
+ruleStatemachineControlScheduler
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlSchedulerAccess().getGroup()); }
+(rule__StatemachineControlScheduler__Group__0)
+{ after(grammarAccess.getStatemachineControlSchedulerAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachinePeripheralDeviceLineDisplay
+entryRuleStatemachinePeripheralDeviceLineDisplay 
+:
+{ before(grammarAccess.getStatemachinePeripheralDeviceLineDisplayRule()); }
+	 ruleStatemachinePeripheralDeviceLineDisplay
+{ after(grammarAccess.getStatemachinePeripheralDeviceLineDisplayRule()); } 
+	 EOF 
+;
+
+// Rule StatemachinePeripheralDeviceLineDisplay
+ruleStatemachinePeripheralDeviceLineDisplay
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getGroup()); }
+(rule__StatemachinePeripheralDeviceLineDisplay__Group__0)
+{ after(grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachinePeripheralDevicePOSPrinter
+entryRuleStatemachinePeripheralDevicePOSPrinter 
+:
+{ before(grammarAccess.getStatemachinePeripheralDevicePOSPrinterRule()); }
+	 ruleStatemachinePeripheralDevicePOSPrinter
+{ after(grammarAccess.getStatemachinePeripheralDevicePOSPrinterRule()); } 
+	 EOF 
+;
+
+// Rule StatemachinePeripheralDevicePOSPrinter
+ruleStatemachinePeripheralDevicePOSPrinter
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getGroup()); }
+(rule__StatemachinePeripheralDevicePOSPrinter__Group__0)
+{ after(grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachinePeripheralDeviceCashDrawer
+entryRuleStatemachinePeripheralDeviceCashDrawer 
+:
+{ before(grammarAccess.getStatemachinePeripheralDeviceCashDrawerRule()); }
+	 ruleStatemachinePeripheralDeviceCashDrawer
+{ after(grammarAccess.getStatemachinePeripheralDeviceCashDrawerRule()); } 
+	 EOF 
+;
+
+// Rule StatemachinePeripheralDeviceCashDrawer
+ruleStatemachinePeripheralDeviceCashDrawer
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getGroup()); }
+(rule__StatemachinePeripheralDeviceCashDrawer__Group__0)
+{ after(grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachinePeripheralDevicePT
+entryRuleStatemachinePeripheralDevicePT 
+:
+{ before(grammarAccess.getStatemachinePeripheralDevicePTRule()); }
+	 ruleStatemachinePeripheralDevicePT
+{ after(grammarAccess.getStatemachinePeripheralDevicePTRule()); } 
+	 EOF 
+;
+
+// Rule StatemachinePeripheralDevicePT
+ruleStatemachinePeripheralDevicePT
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachinePeripheralDevicePTAccess().getGroup()); }
+(rule__StatemachinePeripheralDevicePT__Group__0)
+{ after(grammarAccess.getStatemachinePeripheralDevicePTAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlPeripheral
+entryRuleStatemachineControlPeripheral 
+:
+{ before(grammarAccess.getStatemachineControlPeripheralRule()); }
+	 ruleStatemachineControlPeripheral
+{ after(grammarAccess.getStatemachineControlPeripheralRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlPeripheral
+ruleStatemachineControlPeripheral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlPeripheralAccess().getGroup()); }
+(rule__StatemachineControlPeripheral__Group__0)
+{ after(grammarAccess.getStatemachineControlPeripheralAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttribute
+entryRuleStatemachineControlButtonAttribute 
+:
+{ before(grammarAccess.getStatemachineControlButtonAttributeRule()); }
+	 ruleStatemachineControlButtonAttribute
+{ after(grammarAccess.getStatemachineControlButtonAttributeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttribute
+ruleStatemachineControlButtonAttribute
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlButtonAttributeAccess().getGroup()); }
+(rule__StatemachineControlButtonAttribute__Group__0)
+{ after(grammarAccess.getStatemachineControlButtonAttributeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttributeEvent
+entryRuleStatemachineControlButtonAttributeEvent 
+:
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventRule()); }
+	 ruleStatemachineControlButtonAttributeEvent
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttributeEvent
+ruleStatemachineControlButtonAttributeEvent
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getAlternatives()); }
+(rule__StatemachineControlButtonAttributeEvent__Alternatives)
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttributeEventKeyboard
+entryRuleStatemachineControlButtonAttributeEventKeyboard 
+:
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardRule()); }
+	 ruleStatemachineControlButtonAttributeEventKeyboard
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttributeEventKeyboard
+ruleStatemachineControlButtonAttributeEventKeyboard
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getGroup()); }
+(rule__StatemachineControlButtonAttributeEventKeyboard__Group__0)
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttributeEventIdentity
+entryRuleStatemachineControlButtonAttributeEventIdentity 
+:
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventIdentityRule()); }
+	 ruleStatemachineControlButtonAttributeEventIdentity
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventIdentityRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttributeEventIdentity
+ruleStatemachineControlButtonAttributeEventIdentity
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getGroup()); }
+(rule__StatemachineControlButtonAttributeEventIdentity__Group__0)
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttributeEventEvent
+entryRuleStatemachineControlButtonAttributeEventEvent 
+:
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventEventRule()); }
+	 ruleStatemachineControlButtonAttributeEventEvent
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventEventRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttributeEventEvent
+ruleStatemachineControlButtonAttributeEventEvent
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getGroup()); }
+(rule__StatemachineControlButtonAttributeEventEvent__Group__0)
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlFieldAttribute
+entryRuleStatemachineControlFieldAttribute 
+:
+{ before(grammarAccess.getStatemachineControlFieldAttributeRule()); }
+	 ruleStatemachineControlFieldAttribute
+{ after(grammarAccess.getStatemachineControlFieldAttributeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlFieldAttribute
+ruleStatemachineControlFieldAttribute
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlFieldAttributeAccess().getGroup()); }
+(rule__StatemachineControlFieldAttribute__Group__0)
+{ after(grammarAccess.getStatemachineControlFieldAttributeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlFieldLayout
+entryRuleStatemachineControlFieldLayout 
+:
+{ before(grammarAccess.getStatemachineControlFieldLayoutRule()); }
+	 ruleStatemachineControlFieldLayout
+{ after(grammarAccess.getStatemachineControlFieldLayoutRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlFieldLayout
+ruleStatemachineControlFieldLayout
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlFieldLayoutAccess().getGroup()); }
+(rule__StatemachineControlFieldLayout__Group__0)
+{ after(grammarAccess.getStatemachineControlFieldLayoutAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlDTOAttribute
+entryRuleStatemachineControlDTOAttribute 
+:
+{ before(grammarAccess.getStatemachineControlDTOAttributeRule()); }
+	 ruleStatemachineControlDTOAttribute
+{ after(grammarAccess.getStatemachineControlDTOAttributeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlDTOAttribute
+ruleStatemachineControlDTOAttribute
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlDTOAttributeAccess().getGroup()); }
+(rule__StatemachineControlDTOAttribute__Group__0)
+{ after(grammarAccess.getStatemachineControlDTOAttributeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineControlSchedulerAttribute
+entryRuleStatemachineControlSchedulerAttribute 
+:
+{ before(grammarAccess.getStatemachineControlSchedulerAttributeRule()); }
+	 ruleStatemachineControlSchedulerAttribute
+{ after(grammarAccess.getStatemachineControlSchedulerAttributeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineControlSchedulerAttribute
+ruleStatemachineControlSchedulerAttribute
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getGroup()); }
+(rule__StatemachineControlSchedulerAttribute__Group__0)
+{ after(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineDTOType
+entryRuleStatemachineDTOType 
+:
+{ before(grammarAccess.getStatemachineDTOTypeRule()); }
+	 ruleStatemachineDTOType
+{ after(grammarAccess.getStatemachineDTOTypeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineDTOType
+ruleStatemachineDTOType
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineDTOTypeAccess().getAttributeTypeAssignment()); }
+(rule__StatemachineDTOType__AttributeTypeAssignment)
+{ after(grammarAccess.getStatemachineDTOTypeAccess().getAttributeTypeAssignment()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineFieldType
+entryRuleStatemachineFieldType 
+:
+{ before(grammarAccess.getStatemachineFieldTypeRule()); }
+	 ruleStatemachineFieldType
+{ after(grammarAccess.getStatemachineFieldTypeRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineFieldType
+ruleStatemachineFieldType
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineFieldTypeAccess().getAttributeTypeAssignment()); }
+(rule__StatemachineFieldType__AttributeTypeAssignment)
+{ after(grammarAccess.getStatemachineFieldTypeAccess().getAttributeTypeAssignment()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineImport
+entryRuleStatemachineImport 
+:
+{ before(grammarAccess.getStatemachineImportRule()); }
+	 ruleStatemachineImport
+{ after(grammarAccess.getStatemachineImportRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineImport
+ruleStatemachineImport
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineImportAccess().getGroup()); }
+(rule__StatemachineImport__Group__0)
+{ after(grammarAccess.getStatemachineImportAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStatemachineQualifiedNameWithWildCard
+entryRuleStatemachineQualifiedNameWithWildCard 
+:
+{ before(grammarAccess.getStatemachineQualifiedNameWithWildCardRule()); }
+	 ruleStatemachineQualifiedNameWithWildCard
+{ after(grammarAccess.getStatemachineQualifiedNameWithWildCardRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineQualifiedNameWithWildCard
+ruleStatemachineQualifiedNameWithWildCard
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().getGroup()); }
+(rule__StatemachineQualifiedNameWithWildCard__Group__0)
+{ after(grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().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 entryRuleTRANSLATABLESTRING
+entryRuleTRANSLATABLESTRING 
+:
+{ before(grammarAccess.getTRANSLATABLESTRINGRule()); }
+	 ruleTRANSLATABLESTRING
+{ after(grammarAccess.getTRANSLATABLESTRINGRule()); } 
+	 EOF 
+;
+
+// Rule TRANSLATABLESTRING
+ruleTRANSLATABLESTRING
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); }
+	RULE_STRING
+{ after(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleTRANSLATABLEID
+entryRuleTRANSLATABLEID 
+:
+{ before(grammarAccess.getTRANSLATABLEIDRule()); }
+	 ruleTRANSLATABLEID
+{ after(grammarAccess.getTRANSLATABLEIDRule()); } 
+	 EOF 
+;
+
+// Rule TRANSLATABLEID
+ruleTRANSLATABLEID
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); }
+	RULE_ID
+{ after(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleSignedNumber
+entryRuleSignedNumber 
+:
+{ before(grammarAccess.getSignedNumberRule()); }
+	 ruleSignedNumber
+{ after(grammarAccess.getSignedNumberRule()); } 
+	 EOF 
+;
+
+// Rule SignedNumber
+ruleSignedNumber
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getSignedNumberAccess().getGroup()); }
+(rule__SignedNumber__Group__0)
+{ after(grammarAccess.getSignedNumberAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleUnsignedNumber
+entryRuleUnsignedNumber 
+:
+{ before(grammarAccess.getUnsignedNumberRule()); }
+	 ruleUnsignedNumber
+{ after(grammarAccess.getUnsignedNumberRule()); } 
+	 EOF 
+;
+
+// Rule UnsignedNumber
+ruleUnsignedNumber
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getUnsignedNumberAccess().getGroup()); }
+(rule__UnsignedNumber__Group__0)
+{ after(grammarAccess.getUnsignedNumberAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXAnnotation
+entryRuleXAnnotation 
+:
+{ before(grammarAccess.getXAnnotationRule()); }
+	 ruleXAnnotation
+{ after(grammarAccess.getXAnnotationRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotation
+ruleXAnnotation
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXAnnotationAccess().getGroup()); }
+(rule__XAnnotation__Group__0)
+{ after(grammarAccess.getXAnnotationAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXAnnotationElementValuePair
+entryRuleXAnnotationElementValuePair 
+:
+{ before(grammarAccess.getXAnnotationElementValuePairRule()); }
+	 ruleXAnnotationElementValuePair
+{ after(grammarAccess.getXAnnotationElementValuePairRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValuePair
+ruleXAnnotationElementValuePair
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
+(rule__XAnnotationElementValuePair__Group__0)
+{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXAnnotationElementValueOrCommaList
+entryRuleXAnnotationElementValueOrCommaList 
+:
+{ before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
+	 ruleXAnnotationElementValueOrCommaList
+{ after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValueOrCommaList
+ruleXAnnotationElementValueOrCommaList
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
+(rule__XAnnotationElementValueOrCommaList__Alternatives)
+{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXAnnotationElementValue
+entryRuleXAnnotationElementValue 
+:
+{ before(grammarAccess.getXAnnotationElementValueRule()); }
+	 ruleXAnnotationElementValue
+{ after(grammarAccess.getXAnnotationElementValueRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValue
+ruleXAnnotationElementValue
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
+(rule__XAnnotationElementValue__Alternatives)
+{ after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXAnnotationOrExpression
+entryRuleXAnnotationOrExpression 
+:
+{ before(grammarAccess.getXAnnotationOrExpressionRule()); }
+	 ruleXAnnotationOrExpression
+{ after(grammarAccess.getXAnnotationOrExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotationOrExpression
+ruleXAnnotationOrExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
+(rule__XAnnotationOrExpression__Alternatives)
+{ after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXExpression
+entryRuleXExpression 
+:
+{ before(grammarAccess.getXExpressionRule()); }
+	 ruleXExpression
+{ after(grammarAccess.getXExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XExpression
+ruleXExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
+	ruleXAssignment
+{ after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXAssignment
+entryRuleXAssignment 
+:
+{ before(grammarAccess.getXAssignmentRule()); }
+	 ruleXAssignment
+{ after(grammarAccess.getXAssignmentRule()); } 
+	 EOF 
+;
+
+// Rule XAssignment
+ruleXAssignment
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXAssignmentAccess().getAlternatives()); }
+(rule__XAssignment__Alternatives)
+{ after(grammarAccess.getXAssignmentAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpSingleAssign
+entryRuleOpSingleAssign 
+:
+{ before(grammarAccess.getOpSingleAssignRule()); }
+	 ruleOpSingleAssign
+{ after(grammarAccess.getOpSingleAssignRule()); } 
+	 EOF 
+;
+
+// Rule OpSingleAssign
+ruleOpSingleAssign
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
+
+	'=' 
+
+{ after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpMultiAssign
+entryRuleOpMultiAssign 
+:
+{ before(grammarAccess.getOpMultiAssignRule()); }
+	 ruleOpMultiAssign
+{ after(grammarAccess.getOpMultiAssignRule()); } 
+	 EOF 
+;
+
+// Rule OpMultiAssign
+ruleOpMultiAssign
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
+(rule__OpMultiAssign__Alternatives)
+{ after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXOrExpression
+entryRuleXOrExpression 
+:
+{ before(grammarAccess.getXOrExpressionRule()); }
+	 ruleXOrExpression
+{ after(grammarAccess.getXOrExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XOrExpression
+ruleXOrExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXOrExpressionAccess().getGroup()); }
+(rule__XOrExpression__Group__0)
+{ after(grammarAccess.getXOrExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpOr
+entryRuleOpOr 
+:
+{ before(grammarAccess.getOpOrRule()); }
+	 ruleOpOr
+{ after(grammarAccess.getOpOrRule()); } 
+	 EOF 
+;
+
+// Rule OpOr
+ruleOpOr
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
+
+	'||' 
+
+{ after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXAndExpression
+entryRuleXAndExpression 
+:
+{ before(grammarAccess.getXAndExpressionRule()); }
+	 ruleXAndExpression
+{ after(grammarAccess.getXAndExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XAndExpression
+ruleXAndExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXAndExpressionAccess().getGroup()); }
+(rule__XAndExpression__Group__0)
+{ after(grammarAccess.getXAndExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpAnd
+entryRuleOpAnd 
+:
+{ before(grammarAccess.getOpAndRule()); }
+	 ruleOpAnd
+{ after(grammarAccess.getOpAndRule()); } 
+	 EOF 
+;
+
+// Rule OpAnd
+ruleOpAnd
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
+
+	'&&' 
+
+{ after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXEqualityExpression
+entryRuleXEqualityExpression 
+:
+{ before(grammarAccess.getXEqualityExpressionRule()); }
+	 ruleXEqualityExpression
+{ after(grammarAccess.getXEqualityExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XEqualityExpression
+ruleXEqualityExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
+(rule__XEqualityExpression__Group__0)
+{ after(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpEquality
+entryRuleOpEquality 
+:
+{ before(grammarAccess.getOpEqualityRule()); }
+	 ruleOpEquality
+{ after(grammarAccess.getOpEqualityRule()); } 
+	 EOF 
+;
+
+// Rule OpEquality
+ruleOpEquality
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpEqualityAccess().getAlternatives()); }
+(rule__OpEquality__Alternatives)
+{ after(grammarAccess.getOpEqualityAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXRelationalExpression
+entryRuleXRelationalExpression 
+:
+{ before(grammarAccess.getXRelationalExpressionRule()); }
+	 ruleXRelationalExpression
+{ after(grammarAccess.getXRelationalExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XRelationalExpression
+ruleXRelationalExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
+(rule__XRelationalExpression__Group__0)
+{ after(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpCompare
+entryRuleOpCompare 
+:
+{ before(grammarAccess.getOpCompareRule()); }
+	 ruleOpCompare
+{ after(grammarAccess.getOpCompareRule()); } 
+	 EOF 
+;
+
+// Rule OpCompare
+ruleOpCompare
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpCompareAccess().getAlternatives()); }
+(rule__OpCompare__Alternatives)
+{ after(grammarAccess.getOpCompareAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXOtherOperatorExpression
+entryRuleXOtherOperatorExpression 
+:
+{ before(grammarAccess.getXOtherOperatorExpressionRule()); }
+	 ruleXOtherOperatorExpression
+{ after(grammarAccess.getXOtherOperatorExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XOtherOperatorExpression
+ruleXOtherOperatorExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
+(rule__XOtherOperatorExpression__Group__0)
+{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpOther
+entryRuleOpOther 
+:
+{ before(grammarAccess.getOpOtherRule()); }
+	 ruleOpOther
+{ after(grammarAccess.getOpOtherRule()); } 
+	 EOF 
+;
+
+// Rule OpOther
+ruleOpOther
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpOtherAccess().getAlternatives()); }
+(rule__OpOther__Alternatives)
+{ after(grammarAccess.getOpOtherAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXAdditiveExpression
+entryRuleXAdditiveExpression 
+:
+{ before(grammarAccess.getXAdditiveExpressionRule()); }
+	 ruleXAdditiveExpression
+{ after(grammarAccess.getXAdditiveExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XAdditiveExpression
+ruleXAdditiveExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
+(rule__XAdditiveExpression__Group__0)
+{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpAdd
+entryRuleOpAdd 
+:
+{ before(grammarAccess.getOpAddRule()); }
+	 ruleOpAdd
+{ after(grammarAccess.getOpAddRule()); } 
+	 EOF 
+;
+
+// Rule OpAdd
+ruleOpAdd
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpAddAccess().getAlternatives()); }
+(rule__OpAdd__Alternatives)
+{ after(grammarAccess.getOpAddAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXMultiplicativeExpression
+entryRuleXMultiplicativeExpression 
+:
+{ before(grammarAccess.getXMultiplicativeExpressionRule()); }
+	 ruleXMultiplicativeExpression
+{ after(grammarAccess.getXMultiplicativeExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XMultiplicativeExpression
+ruleXMultiplicativeExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
+(rule__XMultiplicativeExpression__Group__0)
+{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpMulti
+entryRuleOpMulti 
+:
+{ before(grammarAccess.getOpMultiRule()); }
+	 ruleOpMulti
+{ after(grammarAccess.getOpMultiRule()); } 
+	 EOF 
+;
+
+// Rule OpMulti
+ruleOpMulti
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpMultiAccess().getAlternatives()); }
+(rule__OpMulti__Alternatives)
+{ after(grammarAccess.getOpMultiAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXUnaryOperation
+entryRuleXUnaryOperation 
+:
+{ before(grammarAccess.getXUnaryOperationRule()); }
+	 ruleXUnaryOperation
+{ after(grammarAccess.getXUnaryOperationRule()); } 
+	 EOF 
+;
+
+// Rule XUnaryOperation
+ruleXUnaryOperation
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
+(rule__XUnaryOperation__Alternatives)
+{ after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpUnary
+entryRuleOpUnary 
+:
+{ before(grammarAccess.getOpUnaryRule()); }
+	 ruleOpUnary
+{ after(grammarAccess.getOpUnaryRule()); } 
+	 EOF 
+;
+
+// Rule OpUnary
+ruleOpUnary
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpUnaryAccess().getAlternatives()); }
+(rule__OpUnary__Alternatives)
+{ after(grammarAccess.getOpUnaryAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXCastedExpression
+entryRuleXCastedExpression 
+:
+{ before(grammarAccess.getXCastedExpressionRule()); }
+	 ruleXCastedExpression
+{ after(grammarAccess.getXCastedExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XCastedExpression
+ruleXCastedExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXCastedExpressionAccess().getGroup()); }
+(rule__XCastedExpression__Group__0)
+{ after(grammarAccess.getXCastedExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXPostfixOperation
+entryRuleXPostfixOperation 
+:
+{ before(grammarAccess.getXPostfixOperationRule()); }
+	 ruleXPostfixOperation
+{ after(grammarAccess.getXPostfixOperationRule()); } 
+	 EOF 
+;
+
+// Rule XPostfixOperation
+ruleXPostfixOperation
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXPostfixOperationAccess().getGroup()); }
+(rule__XPostfixOperation__Group__0)
+{ after(grammarAccess.getXPostfixOperationAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOpPostfix
+entryRuleOpPostfix 
+:
+{ before(grammarAccess.getOpPostfixRule()); }
+	 ruleOpPostfix
+{ after(grammarAccess.getOpPostfixRule()); } 
+	 EOF 
+;
+
+// Rule OpPostfix
+ruleOpPostfix
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOpPostfixAccess().getAlternatives()); }
+(rule__OpPostfix__Alternatives)
+{ after(grammarAccess.getOpPostfixAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXMemberFeatureCall
+entryRuleXMemberFeatureCall 
+:
+{ before(grammarAccess.getXMemberFeatureCallRule()); }
+	 ruleXMemberFeatureCall
+{ after(grammarAccess.getXMemberFeatureCallRule()); } 
+	 EOF 
+;
+
+// Rule XMemberFeatureCall
+ruleXMemberFeatureCall
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
+(rule__XMemberFeatureCall__Group__0)
+{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXPrimaryExpression
+entryRuleXPrimaryExpression 
+:
+{ before(grammarAccess.getXPrimaryExpressionRule()); }
+	 ruleXPrimaryExpression
+{ after(grammarAccess.getXPrimaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XPrimaryExpression
+ruleXPrimaryExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
+(rule__XPrimaryExpression__Alternatives)
+{ after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXLiteral
+entryRuleXLiteral 
+:
+{ before(grammarAccess.getXLiteralRule()); }
+	 ruleXLiteral
+{ after(grammarAccess.getXLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XLiteral
+ruleXLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXLiteralAccess().getAlternatives()); }
+(rule__XLiteral__Alternatives)
+{ after(grammarAccess.getXLiteralAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXCollectionLiteral
+entryRuleXCollectionLiteral 
+:
+{ before(grammarAccess.getXCollectionLiteralRule()); }
+	 ruleXCollectionLiteral
+{ after(grammarAccess.getXCollectionLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XCollectionLiteral
+ruleXCollectionLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
+(rule__XCollectionLiteral__Alternatives)
+{ after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXSetLiteral
+entryRuleXSetLiteral 
+:
+{ before(grammarAccess.getXSetLiteralRule()); }
+	 ruleXSetLiteral
+{ after(grammarAccess.getXSetLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XSetLiteral
+ruleXSetLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXSetLiteralAccess().getGroup()); }
+(rule__XSetLiteral__Group__0)
+{ after(grammarAccess.getXSetLiteralAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXListLiteral
+entryRuleXListLiteral 
+:
+{ before(grammarAccess.getXListLiteralRule()); }
+	 ruleXListLiteral
+{ after(grammarAccess.getXListLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XListLiteral
+ruleXListLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXListLiteralAccess().getGroup()); }
+(rule__XListLiteral__Group__0)
+{ after(grammarAccess.getXListLiteralAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXClosure
+entryRuleXClosure 
+:
+{ before(grammarAccess.getXClosureRule()); }
+	 ruleXClosure
+{ after(grammarAccess.getXClosureRule()); } 
+	 EOF 
+;
+
+// Rule XClosure
+ruleXClosure
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXClosureAccess().getGroup()); }
+(rule__XClosure__Group__0)
+{ after(grammarAccess.getXClosureAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXExpressionInClosure
+entryRuleXExpressionInClosure 
+:
+{ before(grammarAccess.getXExpressionInClosureRule()); }
+	 ruleXExpressionInClosure
+{ after(grammarAccess.getXExpressionInClosureRule()); } 
+	 EOF 
+;
+
+// Rule XExpressionInClosure
+ruleXExpressionInClosure
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
+(rule__XExpressionInClosure__Group__0)
+{ after(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXShortClosure
+entryRuleXShortClosure 
+:
+{ before(grammarAccess.getXShortClosureRule()); }
+	 ruleXShortClosure
+{ after(grammarAccess.getXShortClosureRule()); } 
+	 EOF 
+;
+
+// Rule XShortClosure
+ruleXShortClosure
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXShortClosureAccess().getGroup()); }
+(rule__XShortClosure__Group__0)
+{ after(grammarAccess.getXShortClosureAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXParenthesizedExpression
+entryRuleXParenthesizedExpression 
+:
+{ before(grammarAccess.getXParenthesizedExpressionRule()); }
+	 ruleXParenthesizedExpression
+{ after(grammarAccess.getXParenthesizedExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XParenthesizedExpression
+ruleXParenthesizedExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
+(rule__XParenthesizedExpression__Group__0)
+{ after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXIfExpression
+entryRuleXIfExpression 
+:
+{ before(grammarAccess.getXIfExpressionRule()); }
+	 ruleXIfExpression
+{ after(grammarAccess.getXIfExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XIfExpression
+ruleXIfExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXIfExpressionAccess().getGroup()); }
+(rule__XIfExpression__Group__0)
+{ after(grammarAccess.getXIfExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXSwitchExpression
+entryRuleXSwitchExpression 
+:
+{ before(grammarAccess.getXSwitchExpressionRule()); }
+	 ruleXSwitchExpression
+{ after(grammarAccess.getXSwitchExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XSwitchExpression
+ruleXSwitchExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
+(rule__XSwitchExpression__Group__0)
+{ after(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXCasePart
+entryRuleXCasePart 
+:
+{ before(grammarAccess.getXCasePartRule()); }
+	 ruleXCasePart
+{ after(grammarAccess.getXCasePartRule()); } 
+	 EOF 
+;
+
+// Rule XCasePart
+ruleXCasePart
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXCasePartAccess().getGroup()); }
+(rule__XCasePart__Group__0)
+{ after(grammarAccess.getXCasePartAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXForLoopExpression
+entryRuleXForLoopExpression 
+:
+{ before(grammarAccess.getXForLoopExpressionRule()); }
+	 ruleXForLoopExpression
+{ after(grammarAccess.getXForLoopExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XForLoopExpression
+ruleXForLoopExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
+(rule__XForLoopExpression__Group__0)
+{ after(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXBasicForLoopExpression
+entryRuleXBasicForLoopExpression 
+:
+{ before(grammarAccess.getXBasicForLoopExpressionRule()); }
+	 ruleXBasicForLoopExpression
+{ after(grammarAccess.getXBasicForLoopExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XBasicForLoopExpression
+ruleXBasicForLoopExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
+(rule__XBasicForLoopExpression__Group__0)
+{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXWhileExpression
+entryRuleXWhileExpression 
+:
+{ before(grammarAccess.getXWhileExpressionRule()); }
+	 ruleXWhileExpression
+{ after(grammarAccess.getXWhileExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XWhileExpression
+ruleXWhileExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXWhileExpressionAccess().getGroup()); }
+(rule__XWhileExpression__Group__0)
+{ after(grammarAccess.getXWhileExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXDoWhileExpression
+entryRuleXDoWhileExpression 
+:
+{ before(grammarAccess.getXDoWhileExpressionRule()); }
+	 ruleXDoWhileExpression
+{ after(grammarAccess.getXDoWhileExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XDoWhileExpression
+ruleXDoWhileExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
+(rule__XDoWhileExpression__Group__0)
+{ after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXBlockExpression
+entryRuleXBlockExpression 
+:
+{ before(grammarAccess.getXBlockExpressionRule()); }
+	 ruleXBlockExpression
+{ after(grammarAccess.getXBlockExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XBlockExpression
+ruleXBlockExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXBlockExpressionAccess().getGroup()); }
+(rule__XBlockExpression__Group__0)
+{ after(grammarAccess.getXBlockExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXExpressionOrVarDeclaration
+entryRuleXExpressionOrVarDeclaration 
+:
+{ before(grammarAccess.getXExpressionOrVarDeclarationRule()); }
+	 ruleXExpressionOrVarDeclaration
+{ after(grammarAccess.getXExpressionOrVarDeclarationRule()); } 
+	 EOF 
+;
+
+// Rule XExpressionOrVarDeclaration
+ruleXExpressionOrVarDeclaration
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
+(rule__XExpressionOrVarDeclaration__Alternatives)
+{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXVariableDeclaration
+entryRuleXVariableDeclaration 
+:
+{ before(grammarAccess.getXVariableDeclarationRule()); }
+	 ruleXVariableDeclaration
+{ after(grammarAccess.getXVariableDeclarationRule()); } 
+	 EOF 
+;
+
+// Rule XVariableDeclaration
+ruleXVariableDeclaration
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
+(rule__XVariableDeclaration__Group__0)
+{ after(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleJvmFormalParameter
+entryRuleJvmFormalParameter 
+:
+{ before(grammarAccess.getJvmFormalParameterRule()); }
+	 ruleJvmFormalParameter
+{ after(grammarAccess.getJvmFormalParameterRule()); } 
+	 EOF 
+;
+
+// Rule JvmFormalParameter
+ruleJvmFormalParameter
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
+(rule__JvmFormalParameter__Group__0)
+{ after(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleFullJvmFormalParameter
+entryRuleFullJvmFormalParameter 
+:
+{ before(grammarAccess.getFullJvmFormalParameterRule()); }
+	 ruleFullJvmFormalParameter
+{ after(grammarAccess.getFullJvmFormalParameterRule()); } 
+	 EOF 
+;
+
+// Rule FullJvmFormalParameter
+ruleFullJvmFormalParameter
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
+(rule__FullJvmFormalParameter__Group__0)
+{ after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXFeatureCall
+entryRuleXFeatureCall 
+:
+{ before(grammarAccess.getXFeatureCallRule()); }
+	 ruleXFeatureCall
+{ after(grammarAccess.getXFeatureCallRule()); } 
+	 EOF 
+;
+
+// Rule XFeatureCall
+ruleXFeatureCall
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXFeatureCallAccess().getGroup()); }
+(rule__XFeatureCall__Group__0)
+{ after(grammarAccess.getXFeatureCallAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleFeatureCallID
+entryRuleFeatureCallID 
+:
+{ before(grammarAccess.getFeatureCallIDRule()); }
+	 ruleFeatureCallID
+{ after(grammarAccess.getFeatureCallIDRule()); } 
+	 EOF 
+;
+
+// Rule FeatureCallID
+ruleFeatureCallID
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
+(rule__FeatureCallID__Alternatives)
+{ after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleIdOrSuper
+entryRuleIdOrSuper 
+:
+{ before(grammarAccess.getIdOrSuperRule()); }
+	 ruleIdOrSuper
+{ after(grammarAccess.getIdOrSuperRule()); } 
+	 EOF 
+;
+
+// Rule IdOrSuper
+ruleIdOrSuper
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
+(rule__IdOrSuper__Alternatives)
+{ after(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXConstructorCall
+entryRuleXConstructorCall 
+:
+{ before(grammarAccess.getXConstructorCallRule()); }
+	 ruleXConstructorCall
+{ after(grammarAccess.getXConstructorCallRule()); } 
+	 EOF 
+;
+
+// Rule XConstructorCall
+ruleXConstructorCall
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXConstructorCallAccess().getGroup()); }
+(rule__XConstructorCall__Group__0)
+{ after(grammarAccess.getXConstructorCallAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXBooleanLiteral
+entryRuleXBooleanLiteral 
+:
+{ before(grammarAccess.getXBooleanLiteralRule()); }
+	 ruleXBooleanLiteral
+{ after(grammarAccess.getXBooleanLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XBooleanLiteral
+ruleXBooleanLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
+(rule__XBooleanLiteral__Group__0)
+{ after(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXNullLiteral
+entryRuleXNullLiteral 
+:
+{ before(grammarAccess.getXNullLiteralRule()); }
+	 ruleXNullLiteral
+{ after(grammarAccess.getXNullLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XNullLiteral
+ruleXNullLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXNullLiteralAccess().getGroup()); }
+(rule__XNullLiteral__Group__0)
+{ after(grammarAccess.getXNullLiteralAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXNumberLiteral
+entryRuleXNumberLiteral 
+:
+{ before(grammarAccess.getXNumberLiteralRule()); }
+	 ruleXNumberLiteral
+{ after(grammarAccess.getXNumberLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XNumberLiteral
+ruleXNumberLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXNumberLiteralAccess().getGroup()); }
+(rule__XNumberLiteral__Group__0)
+{ after(grammarAccess.getXNumberLiteralAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXStringLiteral
+entryRuleXStringLiteral 
+:
+{ before(grammarAccess.getXStringLiteralRule()); }
+	 ruleXStringLiteral
+{ after(grammarAccess.getXStringLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XStringLiteral
+ruleXStringLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXStringLiteralAccess().getGroup()); }
+(rule__XStringLiteral__Group__0)
+{ after(grammarAccess.getXStringLiteralAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXTypeLiteral
+entryRuleXTypeLiteral 
+:
+{ before(grammarAccess.getXTypeLiteralRule()); }
+	 ruleXTypeLiteral
+{ after(grammarAccess.getXTypeLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XTypeLiteral
+ruleXTypeLiteral
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXTypeLiteralAccess().getGroup()); }
+(rule__XTypeLiteral__Group__0)
+{ after(grammarAccess.getXTypeLiteralAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXThrowExpression
+entryRuleXThrowExpression 
+:
+{ before(grammarAccess.getXThrowExpressionRule()); }
+	 ruleXThrowExpression
+{ after(grammarAccess.getXThrowExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XThrowExpression
+ruleXThrowExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXThrowExpressionAccess().getGroup()); }
+(rule__XThrowExpression__Group__0)
+{ after(grammarAccess.getXThrowExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXReturnExpression
+entryRuleXReturnExpression 
+:
+{ before(grammarAccess.getXReturnExpressionRule()); }
+	 ruleXReturnExpression
+{ after(grammarAccess.getXReturnExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XReturnExpression
+ruleXReturnExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXReturnExpressionAccess().getGroup()); }
+(rule__XReturnExpression__Group__0)
+{ after(grammarAccess.getXReturnExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXTryCatchFinallyExpression
+entryRuleXTryCatchFinallyExpression 
+:
+{ before(grammarAccess.getXTryCatchFinallyExpressionRule()); }
+	 ruleXTryCatchFinallyExpression
+{ after(grammarAccess.getXTryCatchFinallyExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XTryCatchFinallyExpression
+ruleXTryCatchFinallyExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
+(rule__XTryCatchFinallyExpression__Group__0)
+{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXSynchronizedExpression
+entryRuleXSynchronizedExpression 
+:
+{ before(grammarAccess.getXSynchronizedExpressionRule()); }
+	 ruleXSynchronizedExpression
+{ after(grammarAccess.getXSynchronizedExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XSynchronizedExpression
+ruleXSynchronizedExpression
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
+(rule__XSynchronizedExpression__Group__0)
+{ after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXCatchClause
+entryRuleXCatchClause 
+:
+{ before(grammarAccess.getXCatchClauseRule()); }
+	 ruleXCatchClause
+{ after(grammarAccess.getXCatchClauseRule()); } 
+	 EOF 
+;
+
+// Rule XCatchClause
+ruleXCatchClause
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXCatchClauseAccess().getGroup()); }
+(rule__XCatchClause__Group__0)
+{ after(grammarAccess.getXCatchClauseAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleNumber
+entryRuleNumber 
+@init {
+	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+}
+:
+{ before(grammarAccess.getNumberRule()); }
+	 ruleNumber
+{ after(grammarAccess.getNumberRule()); } 
+	 EOF 
+;
+finally {
+	myHiddenTokenState.restore();
+}
+
+// Rule Number
+ruleNumber
+    @init {
+		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getNumberAccess().getAlternatives()); }
+(rule__Number__Alternatives)
+{ after(grammarAccess.getNumberAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+	myHiddenTokenState.restore();
+}
+
+
+
+
+
+// Entry rule entryRuleJvmTypeReference
+entryRuleJvmTypeReference 
+:
+{ before(grammarAccess.getJvmTypeReferenceRule()); }
+	 ruleJvmTypeReference
+{ after(grammarAccess.getJvmTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule JvmTypeReference
+ruleJvmTypeReference
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
+(rule__JvmTypeReference__Alternatives)
+{ after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleArrayBrackets
+entryRuleArrayBrackets 
+:
+{ before(grammarAccess.getArrayBracketsRule()); }
+	 ruleArrayBrackets
+{ after(grammarAccess.getArrayBracketsRule()); } 
+	 EOF 
+;
+
+// Rule ArrayBrackets
+ruleArrayBrackets
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getArrayBracketsAccess().getGroup()); }
+(rule__ArrayBrackets__Group__0)
+{ after(grammarAccess.getArrayBracketsAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleXFunctionTypeRef
+entryRuleXFunctionTypeRef 
+:
+{ before(grammarAccess.getXFunctionTypeRefRule()); }
+	 ruleXFunctionTypeRef
+{ after(grammarAccess.getXFunctionTypeRefRule()); } 
+	 EOF 
+;
+
+// Rule XFunctionTypeRef
+ruleXFunctionTypeRef
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
+(rule__XFunctionTypeRef__Group__0)
+{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleJvmParameterizedTypeReference
+entryRuleJvmParameterizedTypeReference 
+:
+{ before(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
+	 ruleJvmParameterizedTypeReference
+{ after(grammarAccess.getJvmParameterizedTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule JvmParameterizedTypeReference
+ruleJvmParameterizedTypeReference
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
+(rule__JvmParameterizedTypeReference__Group__0)
+{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleJvmArgumentTypeReference
+entryRuleJvmArgumentTypeReference 
+:
+{ before(grammarAccess.getJvmArgumentTypeReferenceRule()); }
+	 ruleJvmArgumentTypeReference
+{ after(grammarAccess.getJvmArgumentTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule JvmArgumentTypeReference
+ruleJvmArgumentTypeReference
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
+(rule__JvmArgumentTypeReference__Alternatives)
+{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleJvmWildcardTypeReference
+entryRuleJvmWildcardTypeReference 
+:
+{ before(grammarAccess.getJvmWildcardTypeReferenceRule()); }
+	 ruleJvmWildcardTypeReference
+{ after(grammarAccess.getJvmWildcardTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule JvmWildcardTypeReference
+ruleJvmWildcardTypeReference
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
+(rule__JvmWildcardTypeReference__Group__0)
+{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleJvmUpperBound
+entryRuleJvmUpperBound 
+:
+{ before(grammarAccess.getJvmUpperBoundRule()); }
+	 ruleJvmUpperBound
+{ after(grammarAccess.getJvmUpperBoundRule()); } 
+	 EOF 
+;
+
+// Rule JvmUpperBound
+ruleJvmUpperBound
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
+(rule__JvmUpperBound__Group__0)
+{ after(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleJvmUpperBoundAnded
+entryRuleJvmUpperBoundAnded 
+:
+{ before(grammarAccess.getJvmUpperBoundAndedRule()); }
+	 ruleJvmUpperBoundAnded
+{ after(grammarAccess.getJvmUpperBoundAndedRule()); } 
+	 EOF 
+;
+
+// Rule JvmUpperBoundAnded
+ruleJvmUpperBoundAnded
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
+(rule__JvmUpperBoundAnded__Group__0)
+{ after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleJvmLowerBound
+entryRuleJvmLowerBound 
+:
+{ before(grammarAccess.getJvmLowerBoundRule()); }
+	 ruleJvmLowerBound
+{ after(grammarAccess.getJvmLowerBoundRule()); } 
+	 EOF 
+;
+
+// Rule JvmLowerBound
+ruleJvmLowerBound
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
+(rule__JvmLowerBound__Group__0)
+{ after(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleJvmLowerBoundAnded
+entryRuleJvmLowerBoundAnded 
+:
+{ before(grammarAccess.getJvmLowerBoundAndedRule()); }
+	 ruleJvmLowerBoundAnded
+{ after(grammarAccess.getJvmLowerBoundAndedRule()); } 
+	 EOF 
+;
+
+// Rule JvmLowerBoundAnded
+ruleJvmLowerBoundAnded
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
+(rule__JvmLowerBoundAnded__Group__0)
+{ after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+// Entry rule entryRuleQualifiedNameWithWildcard
+entryRuleQualifiedNameWithWildcard 
+:
+{ before(grammarAccess.getQualifiedNameWithWildcardRule()); }
+	 ruleQualifiedNameWithWildcard
+{ after(grammarAccess.getQualifiedNameWithWildcardRule()); } 
+	 EOF 
+;
+
+// Rule QualifiedNameWithWildcard
+ruleQualifiedNameWithWildcard
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
+(rule__QualifiedNameWithWildcard__Group__0)
+{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+// Entry rule 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 StatemachineInternalType
+ruleStatemachineInternalType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineInternalTypeAccess().getAlternatives()); }
+(rule__StatemachineInternalType__Alternatives)
+{ after(grammarAccess.getStatemachineInternalTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachineControlButtonEventType
+ruleStatemachineControlButtonEventType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineControlButtonEventTypeAccess().getAlternatives()); }
+(rule__StatemachineControlButtonEventType__Alternatives)
+{ after(grammarAccess.getStatemachineControlButtonEventTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachineEvaluationType
+ruleStatemachineEvaluationType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getAlternatives()); }
+(rule__StatemachineEvaluationType__Alternatives)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachineUserMessageType
+ruleStatemachineUserMessageType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getAlternatives()); }
+(rule__StatemachineUserMessageType__Alternatives)
+{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachineLineDisplayCursorType
+ruleStatemachineLineDisplayCursorType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getAlternatives()); }
+(rule__StatemachineLineDisplayCursorType__Alternatives)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachineLineDisplayMarqueeType
+ruleStatemachineLineDisplayMarqueeType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getAlternatives()); }
+(rule__StatemachineLineDisplayMarqueeType__Alternatives)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachineLineDisplayMarqueeFormat
+ruleStatemachineLineDisplayMarqueeFormat
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getAlternatives()); }
+(rule__StatemachineLineDisplayMarqueeFormat__Alternatives)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachineLineDisplayTextType
+ruleStatemachineLineDisplayTextType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getAlternatives()); }
+(rule__StatemachineLineDisplayTextType__Alternatives)
+{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachineLineDisplayScrollTextType
+ruleStatemachineLineDisplayScrollTextType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getAlternatives()); }
+(rule__StatemachineLineDisplayScrollTextType__Alternatives)
+{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Rule StatemachinePOSPrinterBarcodeType
+ruleStatemachinePOSPrinterBarcodeType
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getAlternatives()); }
+(rule__StatemachinePOSPrinterBarcodeType__Alternatives)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+rule__StatemachineAction__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralBlinkRateParserRuleCall_0()); }
+	ruleStatemachineActionPeripheralBlinkRate
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralBlinkRateParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralClearParserRuleCall_1()); }
+	ruleStatemachineActionPeripheralClear
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralClearParserRuleCall_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCreateWindowParserRuleCall_2()); }
+	ruleStatemachineActionPeripheralCreateWindow
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCreateWindowParserRuleCall_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCursorTypeParserRuleCall_3()); }
+	ruleStatemachineActionPeripheralCursorType
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCursorTypeParserRuleCall_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDestroyWindowParserRuleCall_4()); }
+	ruleStatemachineActionPeripheralDestroyWindow
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDestroyWindowParserRuleCall_4()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5()); }
+	ruleStatemachineActionPeripheralDeviceBrightness
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayBitmapParserRuleCall_6()); }
+	ruleStatemachineActionPeripheralDisplayBitmap
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayBitmapParserRuleCall_6()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextParserRuleCall_7()); }
+	ruleStatemachineActionPeripheralDisplayText
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextParserRuleCall_7()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextAtParserRuleCall_8()); }
+	ruleStatemachineActionPeripheralDisplayTextAt
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextAtParserRuleCall_8()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9()); }
+	ruleStatemachineActionPeripheralInterCharacterWait
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeFormatParserRuleCall_10()); }
+	ruleStatemachineActionPeripheralMarqueeFormat
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeFormatParserRuleCall_10()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11()); }
+	ruleStatemachineActionPeripheralMarqueeRepeatWait
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeTypeParserRuleCall_12()); }
+	ruleStatemachineActionPeripheralMarqueeType
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeTypeParserRuleCall_12()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13()); }
+	ruleStatemachineActionPeripheralMarqueeUnitWait
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralScrollParserRuleCall_14()); }
+	ruleStatemachineActionPeripheralScroll
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralScrollParserRuleCall_14()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralOpenDrawerParserRuleCall_15()); }
+	ruleStatemachineActionPeripheralOpenDrawer
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralOpenDrawerParserRuleCall_15()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBarcodeParserRuleCall_16()); }
+	ruleStatemachineActionPeripheralPrintBarcode
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBarcodeParserRuleCall_16()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBitmapParserRuleCall_17()); }
+	ruleStatemachineActionPeripheralPrintBitmap
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBitmapParserRuleCall_17()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintCutParserRuleCall_18()); }
+	ruleStatemachineActionPeripheralPrintCut
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintCutParserRuleCall_18()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintNormalParserRuleCall_19()); }
+	ruleStatemachineActionPeripheralPrintNormal
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintNormalParserRuleCall_19()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20()); }
+	ruleStatemachineActionPeripheralPrintRegisterBitmap
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTOpenParserRuleCall_21()); }
+	ruleStatemachineActionPeripheralPTOpen
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTOpenParserRuleCall_21()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTCloseParserRuleCall_22()); }
+	ruleStatemachineActionPeripheralPTClose
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTCloseParserRuleCall_22()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23()); }
+	ruleStatemachineActionPeripheralPTAcknowledge
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTReversalParserRuleCall_24()); }
+	ruleStatemachineActionPeripheralPTReversal
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTReversalParserRuleCall_24()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTRegistrationParserRuleCall_25()); }
+	ruleStatemachineActionPeripheralPTRegistration
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTRegistrationParserRuleCall_25()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAuthorizationParserRuleCall_26()); }
+	ruleStatemachineActionPeripheralPTAuthorization
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAuthorizationParserRuleCall_26()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintReportParserRuleCall_27()); }
+	ruleStatemachineActionPeripheralPrintReport
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintReportParserRuleCall_27()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldSetParserRuleCall_28()); }
+	ruleStatemachineActionFieldSet
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldSetParserRuleCall_28()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldRemoveParserRuleCall_29()); }
+	ruleStatemachineActionFieldRemove
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldRemoveParserRuleCall_29()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemVisibleParserRuleCall_30()); }
+	ruleStatemachineActionItemVisible
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemVisibleParserRuleCall_30()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemInvisibleParserRuleCall_31()); }
+	ruleStatemachineActionItemInvisible
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemInvisibleParserRuleCall_31()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldClearParserRuleCall_32()); }
+	ruleStatemachineActionFieldClear
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldClearParserRuleCall_32()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonCaptionParserRuleCall_33()); }
+	ruleStatemachineActionButtonCaption
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonCaptionParserRuleCall_33()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonImageParserRuleCall_34()); }
+	ruleStatemachineActionButtonImage
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonImageParserRuleCall_34()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionDTOFindParserRuleCall_35()); }
+	ruleStatemachineActionDTOFind
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionDTOFindParserRuleCall_35()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineStorageParserRuleCall_36()); }
+	ruleStatemachineStorage
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineStorageParserRuleCall_36()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionSchedulerParserRuleCall_37()); }
+	ruleStatemachineActionScheduler
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionSchedulerParserRuleCall_37()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineOperationParserRuleCall_38()); }
+	ruleStatemachineOperation
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineOperationParserRuleCall_38()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionConditionalTransitionParserRuleCall_39()); }
+	ruleStatemachineActionConditionalTransition
+{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionConditionalTransitionParserRuleCall_39()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineActionFieldSource__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceStringParserRuleCall_0()); }
+	ruleStatemachineActionFieldSourceString
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceStringParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceNumberParserRuleCall_1()); }
+	ruleStatemachineActionFieldSourceNumber
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceNumberParserRuleCall_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEvaluateParserRuleCall_2()); }
+	ruleStatemachineActionFieldSourceEvaluate
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEvaluateParserRuleCall_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceTranslateParserRuleCall_3()); }
+	ruleStatemachineActionFieldSourceTranslate
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceTranslateParserRuleCall_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldGetParserRuleCall_4()); }
+	ruleStatemachineActionFieldGet
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldGetParserRuleCall_4()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineFunctionParserRuleCall_5()); }
+	ruleStatemachineFunction
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineFunctionParserRuleCall_5()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineStorageRetrieveParserRuleCall_6()); }
+	ruleStatemachineStorageRetrieve
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineStorageRetrieveParserRuleCall_6()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceDtoAttributeParserRuleCall_7()); }
+	ruleStatemachineActionFieldSourceDtoAttribute
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceDtoAttributeParserRuleCall_7()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEventParserRuleCall_8()); }
+	ruleStatemachineActionFieldSourceEvent
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEventParserRuleCall_8()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionPeripheralPTResponseParserRuleCall_9()); }
+	ruleStatemachineActionPeripheralPTResponse
+{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionPeripheralPTResponseParserRuleCall_9()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineActionFieldSourceMore__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceStringMoreParserRuleCall_0()); }
+	ruleStatemachineActionFieldSourceStringMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceStringMoreParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceNumberMoreParserRuleCall_1()); }
+	ruleStatemachineActionFieldSourceNumberMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceNumberMoreParserRuleCall_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceEvaluateMoreParserRuleCall_2()); }
+	ruleStatemachineActionFieldSourceEvaluateMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceEvaluateMoreParserRuleCall_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceTranslateMoreParserRuleCall_3()); }
+	ruleStatemachineActionFieldSourceTranslateMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceTranslateMoreParserRuleCall_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldGetMoreParserRuleCall_4()); }
+	ruleStatemachineActionFieldGetMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldGetMoreParserRuleCall_4()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineOperationMoreParserRuleCall_5()); }
+	ruleStatemachineOperationMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineOperationMoreParserRuleCall_5()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineStorageRetrieveMoreParserRuleCall_6()); }
+	ruleStatemachineStorageRetrieveMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineStorageRetrieveMoreParserRuleCall_6()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceDtoAttributeMoreParserRuleCall_7()); }
+	ruleStatemachineActionFieldSourceDtoAttributeMore
+{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceDtoAttributeMoreParserRuleCall_7()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineControl__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlButtonParserRuleCall_0()); }
+	ruleStatemachineControlButton
+{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlButtonParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlFieldParserRuleCall_1()); }
+	ruleStatemachineControlField
+{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlFieldParserRuleCall_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlDTOParserRuleCall_2()); }
+	ruleStatemachineControlDTO
+{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlDTOParserRuleCall_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlSchedulerParserRuleCall_3()); }
+	ruleStatemachineControlScheduler
+{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlSchedulerParserRuleCall_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlPeripheralParserRuleCall_4()); }
+	ruleStatemachineControlPeripheral
+{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlPeripheralParserRuleCall_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineControlButtonAttributeEvent__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventKeyboardParserRuleCall_0()); }
+	ruleStatemachineControlButtonAttributeEventKeyboard
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventKeyboardParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventIdentityParserRuleCall_1()); }
+	ruleStatemachineControlButtonAttributeEventIdentity
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventIdentityParserRuleCall_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventEventParserRuleCall_2()); }
+	ruleStatemachineControlButtonAttributeEventEvent
+{ after(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventEventParserRuleCall_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Alternatives_3_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
+(rule__XAnnotation__Group_3_1_0__0)
+{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
+(rule__XAnnotation__ValueAssignment_3_1_1)
+{ after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
+(rule__XAnnotationElementValueOrCommaList__Group_0__0)
+{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
+(rule__XAnnotationElementValueOrCommaList__Group_1__0)
+{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
+(rule__XAnnotationElementValue__Group_0__0)
+{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
+	ruleXAnnotationOrExpression
+{ after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationOrExpression__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
+	ruleXAnnotation
+{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
+	ruleXExpression
+{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXAssignmentAccess().getGroup_0()); }
+(rule__XAssignment__Group_0__0)
+{ after(grammarAccess.getXAssignmentAccess().getGroup_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXAssignmentAccess().getGroup_1()); }
+(rule__XAssignment__Group_1__0)
+{ after(grammarAccess.getXAssignmentAccess().getGroup_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
+
+	'+=' 
+
+{ after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
+
+	'-=' 
+
+{ after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
+
+	'*=' 
+
+{ after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
+
+	'/=' 
+
+{ after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
+
+	'%=' 
+
+{ after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
+(rule__OpMultiAssign__Group_5__0)
+{ after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
+(rule__OpMultiAssign__Group_6__0)
+{ after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpEquality__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
+
+	'==' 
+
+{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
+
+	'!=' 
+
+{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
+)
+
+    |(
+{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
+
+	'===' 
+
+{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
+)
+
+    |(
+{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
+
+	'!==' 
+
+{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Alternatives_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
+(rule__XRelationalExpression__Group_1_0__0)
+{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
+(rule__XRelationalExpression__Group_1_1__0)
+{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpCompare__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
+
+	'>=' 
+
+{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpCompareAccess().getGroup_1()); }
+(rule__OpCompare__Group_1__0)
+{ after(grammarAccess.getOpCompareAccess().getGroup_1()); }
+)
+
+    |(
+{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
+
+	'>' 
+
+{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
+)
+
+    |(
+{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
+
+	'<' 
+
+{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
+
+	'->' 
+
+{ after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
+
+	'..<' 
+
+{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getGroup_2()); }
+(rule__OpOther__Group_2__0)
+{ after(grammarAccess.getOpOtherAccess().getGroup_2()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
+
+	'..' 
+
+{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
+
+	'=>' 
+
+{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getGroup_5()); }
+(rule__OpOther__Group_5__0)
+{ after(grammarAccess.getOpOtherAccess().getGroup_5()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getGroup_6()); }
+(rule__OpOther__Group_6__0)
+{ after(grammarAccess.getOpOtherAccess().getGroup_6()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
+
+	'<>' 
+
+{ after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
+
+	'?:' 
+
+{ after(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Alternatives_5_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
+(rule__OpOther__Group_5_1_0__0)
+{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
+
+	'>' 
+
+{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Alternatives_6_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
+(rule__OpOther__Group_6_1_0__0)
+{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
+
+	'<' 
+
+{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
+)
+
+    |(
+{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
+
+	'=>' 
+
+{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpAdd__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
+
+	'+' 
+
+{ after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
+
+	'-' 
+
+{ after(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMulti__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
+
+	'*' 
+
+{ after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
+
+	'**' 
+
+{ after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
+
+	'/' 
+
+{ after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
+)
+
+    |(
+{ before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
+
+	'%' 
+
+{ after(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
+(rule__XUnaryOperation__Group_0__0)
+{ after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
+	ruleXCastedExpression
+{ after(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpUnary__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
+
+	'!' 
+
+{ after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
+
+	'-' 
+
+{ after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
+)
+
+    |(
+{ before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
+
+	'+' 
+
+{ after(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpPostfix__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
+
+	'++' 
+
+{ after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
+)
+
+    |(
+{ before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
+
+	'--' 
+
+{ after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Alternatives_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
+(rule__XMemberFeatureCall__Group_1_0__0)
+{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
+(rule__XMemberFeatureCall__Group_1_1__0)
+{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
+
+	'.' 
+
+{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
+(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1)
+{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
+
+	'.' 
+
+{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
+(rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1)
+{ after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
+)
+
+    |(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
+(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2)
+{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Alternatives_1_1_3_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
+(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0)
+{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
+(rule__XMemberFeatureCall__Group_1_1_3_1_1__0)
+{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPrimaryExpression__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
+	ruleXConstructorCall
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
+	ruleXBlockExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
+	ruleXSwitchExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
+(	ruleXSynchronizedExpression)
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
+	ruleXFeatureCall
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
+	ruleXLiteral
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
+	ruleXIfExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
+(	ruleXForLoopExpression)
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
+	ruleXBasicForLoopExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
+	ruleXWhileExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
+	ruleXDoWhileExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
+	ruleXThrowExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
+	ruleXReturnExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
+	ruleXTryCatchFinallyExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
+)
+
+    |(
+{ before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
+	ruleXParenthesizedExpression
+{ after(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XLiteral__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
+	ruleXCollectionLiteral
+{ after(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
+(	ruleXClosure)
+{ after(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
+)
+
+    |(
+{ before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
+	ruleXBooleanLiteral
+{ after(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
+)
+
+    |(
+{ before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
+	ruleXNumberLiteral
+{ after(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
+)
+
+    |(
+{ before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
+	ruleXNullLiteral
+{ after(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
+)
+
+    |(
+{ before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
+	ruleXStringLiteral
+{ after(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
+)
+
+    |(
+{ before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
+	ruleXTypeLiteral
+{ after(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCollectionLiteral__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
+	ruleXSetLiteral
+{ after(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
+	ruleXListLiteral
+{ after(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Alternatives_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
+(rule__XSwitchExpression__Group_2_0__0)
+{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
+(rule__XSwitchExpression__Group_2_1__0)
+{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Alternatives_3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
+(rule__XCasePart__Group_3_0__0)
+{ after(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
+(rule__XCasePart__FallThroughAssignment_3_1)
+{ after(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionOrVarDeclaration__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
+	ruleXVariableDeclaration
+{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
+	ruleXExpression
+{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Alternatives_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
+(rule__XVariableDeclaration__WriteableAssignment_1_0)
+{ after(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
+
+	'val' 
+
+{ after(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Alternatives_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
+(rule__XVariableDeclaration__Group_2_0__0)
+{ after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
+(rule__XVariableDeclaration__NameAssignment_2_1)
+{ after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Alternatives_3_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
+(rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0)
+{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
+(rule__XFeatureCall__Group_3_1_1__0)
+{ after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FeatureCallID__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
+	ruleValidID
+{ after(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
+
+	'extends' 
+
+{ after(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
+)
+
+    |(
+{ before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
+
+	'static' 
+
+{ after(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
+)
+
+    |(
+{ before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
+
+	'import' 
+
+{ after(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
+)
+
+    |(
+{ before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
+
+	'extension' 
+
+{ after(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IdOrSuper__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
+	ruleFeatureCallID
+{ after(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
+
+	'super' 
+
+{ after(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Alternatives_4_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
+(rule__XConstructorCall__ArgumentsAssignment_4_1_0)
+{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
+(rule__XConstructorCall__Group_4_1_1__0)
+{ after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBooleanLiteral__Alternatives_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
+
+	'false' 
+
+{ after(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
+(rule__XBooleanLiteral__IsTrueAssignment_1_1)
+{ after(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Alternatives_3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
+(rule__XTryCatchFinallyExpression__Group_3_0__0)
+{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
+)
+
+    |(
+{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
+(rule__XTryCatchFinallyExpression__Group_3_1__0)
+{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
+	RULE_HEX
+{ after(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getNumberAccess().getGroup_1()); }
+(rule__Number__Group_1__0)
+{ after(grammarAccess.getNumberAccess().getGroup_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Alternatives_1_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
+	RULE_INT
+{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
+)
+
+    |(
+{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
+	RULE_DECIMAL
+{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Alternatives_1_1_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
+	RULE_INT
+{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
+	RULE_DECIMAL
+{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
+(rule__JvmTypeReference__Group_0__0)
+{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
+)
+
+    |(
+{ before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
+	ruleXFunctionTypeRef
+{ after(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmArgumentTypeReference__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
+	ruleJvmTypeReference
+{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
+	ruleJvmWildcardTypeReference
+{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Alternatives_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
+(rule__JvmWildcardTypeReference__Group_2_0__0)
+{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
+)
+
+    |(
+{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
+(rule__JvmWildcardTypeReference__Group_2_1__0)
+{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__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__StatemachineInternalType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineInternalTypeAccess().getBOOLEANEnumLiteralDeclaration_0()); }
+(	'Boolean' 
+)
+{ after(grammarAccess.getStatemachineInternalTypeAccess().getBOOLEANEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineInternalTypeAccess().getINTEGEREnumLiteralDeclaration_1()); }
+(	'Integer' 
+)
+{ after(grammarAccess.getStatemachineInternalTypeAccess().getINTEGEREnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineInternalTypeAccess().getLONGEnumLiteralDeclaration_2()); }
+(	'Long' 
+)
+{ after(grammarAccess.getStatemachineInternalTypeAccess().getLONGEnumLiteralDeclaration_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineInternalTypeAccess().getDOUBLEEnumLiteralDeclaration_3()); }
+(	'Double' 
+)
+{ after(grammarAccess.getStatemachineInternalTypeAccess().getDOUBLEEnumLiteralDeclaration_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineInternalTypeAccess().getSTRINGEnumLiteralDeclaration_4()); }
+(	'String' 
+)
+{ after(grammarAccess.getStatemachineInternalTypeAccess().getSTRINGEnumLiteralDeclaration_4()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineInternalTypeAccess().getDATEEnumLiteralDeclaration_5()); }
+(	'Date' 
+)
+{ after(grammarAccess.getStatemachineInternalTypeAccess().getDATEEnumLiteralDeclaration_5()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineInternalTypeAccess().getSUGGESTTEXTEnumLiteralDeclaration_6()); }
+(	'SuggestText' 
+)
+{ after(grammarAccess.getStatemachineInternalTypeAccess().getSUGGESTTEXTEnumLiteralDeclaration_6()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineControlButtonEventType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineControlButtonEventTypeAccess().getKEYBOARDEnumLiteralDeclaration_0()); }
+(	'keyboard' 
+)
+{ after(grammarAccess.getStatemachineControlButtonEventTypeAccess().getKEYBOARDEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineControlButtonEventTypeAccess().getTRIGGEREnumLiteralDeclaration_1()); }
+(	'trigger' 
+)
+{ after(grammarAccess.getStatemachineControlButtonEventTypeAccess().getTRIGGEREnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineControlButtonEventTypeAccess().getIDENTITYEnumLiteralDeclaration_2()); }
+(	'identity' 
+)
+{ after(grammarAccess.getStatemachineControlButtonEventTypeAccess().getIDENTITYEnumLiteralDeclaration_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineEvaluationType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getIP_ADDRESSEnumLiteralDeclaration_0()); }
+(	'getIPAddress' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getIP_ADDRESSEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getNOWEnumLiteralDeclaration_1()); }
+(	'getNow' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getNOWEnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_AGENT_INFOEnumLiteralDeclaration_2()); }
+(	'getUserAgentInfo' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_AGENT_INFOEnumLiteralDeclaration_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getIS_TOUCH_DEVICEEnumLiteralDeclaration_3()); }
+(	'isTouchDevice' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getIS_TOUCH_DEVICEEnumLiteralDeclaration_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getIS_HTTPSEnumLiteralDeclaration_4()); }
+(	'isHttps' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getIS_HTTPSEnumLiteralDeclaration_4()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getBROWSER_LOCALEEnumLiteralDeclaration_5()); }
+(	'getBrowserLocale' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getBROWSER_LOCALEEnumLiteralDeclaration_5()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_NAMEEnumLiteralDeclaration_6()); }
+(	'getUserName' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_NAMEEnumLiteralDeclaration_6()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_PASSWORDEnumLiteralDeclaration_7()); }
+(	'getUserPassword' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_PASSWORDEnumLiteralDeclaration_7()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_EMAILEnumLiteralDeclaration_8()); }
+(	'getUserEmail' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_EMAILEnumLiteralDeclaration_8()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_POSITIONEnumLiteralDeclaration_9()); }
+(	'getUserPosition' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_POSITIONEnumLiteralDeclaration_9()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_PRTSERVICEEnumLiteralDeclaration_10()); }
+(	'getUserPrintService' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_PRTSERVICEEnumLiteralDeclaration_10()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getSCREEN_WIDTHEnumLiteralDeclaration_11()); }
+(	'getSceenWidth' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getSCREEN_WIDTHEnumLiteralDeclaration_11()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getSCREEN_HEIGHTEnumLiteralDeclaration_12()); }
+(	'getScreenHeight' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getSCREEN_HEIGHTEnumLiteralDeclaration_12()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getTRIGGEREnumLiteralDeclaration_13()); }
+(	'getTrigger' 
+)
+{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getTRIGGEREnumLiteralDeclaration_13()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineUserMessageType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getHUMANIZED_MESSAGEEnumLiteralDeclaration_0()); }
+(	'humanized' 
+)
+{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getHUMANIZED_MESSAGEEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getWARNING_MESSAGEEnumLiteralDeclaration_1()); }
+(	'warning' 
+)
+{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getWARNING_MESSAGEEnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getERROR_MESSAGEEnumLiteralDeclaration_2()); }
+(	'error' 
+)
+{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getERROR_MESSAGEEnumLiteralDeclaration_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getTRAY_NOTIFICATIONEnumLiteralDeclaration_3()); }
+(	'tray' 
+)
+{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getTRAY_NOTIFICATIONEnumLiteralDeclaration_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4()); }
+(	'assistive' 
+)
+{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineLineDisplayCursorType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_NONEEnumLiteralDeclaration_0()); }
+(	'none' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_NONEEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_FIXEDEnumLiteralDeclaration_1()); }
+(	'fixed' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_FIXEDEnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_BLOCKEnumLiteralDeclaration_2()); }
+(	'block' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_BLOCKEnumLiteralDeclaration_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_HALFBLOCKEnumLiteralDeclaration_3()); }
+(	'halfblock' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_HALFBLOCKEnumLiteralDeclaration_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_UNDERLINEEnumLiteralDeclaration_4()); }
+(	'underline' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_UNDERLINEEnumLiteralDeclaration_4()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_REVERSEEnumLiteralDeclaration_5()); }
+(	'reverse' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_REVERSEEnumLiteralDeclaration_5()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_OTHEREnumLiteralDeclaration_6()); }
+(	'other' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_OTHEREnumLiteralDeclaration_6()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_BLINKEnumLiteralDeclaration_7()); }
+(	'blink' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_BLINKEnumLiteralDeclaration_7()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineLineDisplayMarqueeType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_NONEEnumLiteralDeclaration_0()); }
+(	'none' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_NONEEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_UPEnumLiteralDeclaration_1()); }
+(	'up' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_UPEnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_DOWNEnumLiteralDeclaration_2()); }
+(	'down' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_DOWNEnumLiteralDeclaration_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_LEFTEnumLiteralDeclaration_3()); }
+(	'left' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_LEFTEnumLiteralDeclaration_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_RIGHTEnumLiteralDeclaration_4()); }
+(	'right' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_RIGHTEnumLiteralDeclaration_4()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_INITEnumLiteralDeclaration_5()); }
+(	'init' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_INITEnumLiteralDeclaration_5()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineLineDisplayMarqueeFormat__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getDISP_MF_WALKEnumLiteralDeclaration_0()); }
+(	'walk' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getDISP_MF_WALKEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getDISP_MF_PLACEEnumLiteralDeclaration_1()); }
+(	'place' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getDISP_MF_PLACEEnumLiteralDeclaration_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineLineDisplayTextType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_NORMALEnumLiteralDeclaration_0()); }
+(	'normal' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_NORMALEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_BLINKEnumLiteralDeclaration_1()); }
+(	'blink' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_BLINKEnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_REVERSEEnumLiteralDeclaration_2()); }
+(	'reverse' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_REVERSEEnumLiteralDeclaration_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3()); }
+(	'blinkreverse' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineLineDisplayScrollTextType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_UPEnumLiteralDeclaration_0()); }
+(	'up' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_UPEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_DOWNEnumLiteralDeclaration_1()); }
+(	'down' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_DOWNEnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_LEFTEnumLiteralDeclaration_2()); }
+(	'left' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_LEFTEnumLiteralDeclaration_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_RIGHTEnumLiteralDeclaration_3()); }
+(	'right' 
+)
+{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_RIGHTEnumLiteralDeclaration_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePOSPrinterBarcodeType__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCAEnumLiteralDeclaration_0()); }
+(	'upca' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCAEnumLiteralDeclaration_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCEEnumLiteralDeclaration_1()); }
+(	'upcb' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCEEnumLiteralDeclaration_1()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN8EnumLiteralDeclaration_2()); }
+(	'jan8' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN8EnumLiteralDeclaration_2()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8EnumLiteralDeclaration_3()); }
+(	'ean8' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8EnumLiteralDeclaration_3()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN13EnumLiteralDeclaration_4()); }
+(	'jan13' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN13EnumLiteralDeclaration_4()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13EnumLiteralDeclaration_5()); }
+(	'ean13' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13EnumLiteralDeclaration_5()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_TFEnumLiteralDeclaration_6()); }
+(	'tf' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_TFEnumLiteralDeclaration_6()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_ITFEnumLiteralDeclaration_7()); }
+(	'itf' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_ITFEnumLiteralDeclaration_7()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_CodabarEnumLiteralDeclaration_8()); }
+(	'codeabar' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_CodabarEnumLiteralDeclaration_8()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code39EnumLiteralDeclaration_9()); }
+(	'code39' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code39EnumLiteralDeclaration_9()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code93EnumLiteralDeclaration_10()); }
+(	'code93' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code93EnumLiteralDeclaration_10()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128EnumLiteralDeclaration_11()); }
+(	'code128' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128EnumLiteralDeclaration_11()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCA_SEnumLiteralDeclaration_12()); }
+(	'upca_s' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCA_SEnumLiteralDeclaration_12()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCE_SEnumLiteralDeclaration_13()); }
+(	'upce_s' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCE_SEnumLiteralDeclaration_13()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD1EnumLiteralDeclaration_14()); }
+(	'upcd1' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD1EnumLiteralDeclaration_14()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD2EnumLiteralDeclaration_15()); }
+(	'upcd2' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD2EnumLiteralDeclaration_15()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD3EnumLiteralDeclaration_16()); }
+(	'upcd3' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD3EnumLiteralDeclaration_16()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD4EnumLiteralDeclaration_17()); }
+(	'upcd4' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD4EnumLiteralDeclaration_17()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD5EnumLiteralDeclaration_18()); }
+(	'upcd5' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD5EnumLiteralDeclaration_18()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8_SEnumLiteralDeclaration_19()); }
+(	'ean8_s' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8_SEnumLiteralDeclaration_19()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13_SEnumLiteralDeclaration_20()); }
+(	'ean13_s' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13_SEnumLiteralDeclaration_20()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN128EnumLiteralDeclaration_21()); }
+(	'ean128' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN128EnumLiteralDeclaration_21()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRAEnumLiteralDeclaration_22()); }
+(	'orca' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRAEnumLiteralDeclaration_22()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRBEnumLiteralDeclaration_23()); }
+(	'ocrb' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRBEnumLiteralDeclaration_23()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24()); }
+(	'code128_parsed' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAREnumLiteralDeclaration_25()); }
+(	'gs1databar' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAREnumLiteralDeclaration_25()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26()); }
+(	'gs1databar_e' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27()); }
+(	'gs1databar_s' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28()); }
+(	'gs1databar_e_s' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_PDF417EnumLiteralDeclaration_29()); }
+(	'pdf417' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_PDF417EnumLiteralDeclaration_29()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_MAXICODEEnumLiteralDeclaration_30()); }
+(	'maxicode' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_MAXICODEEnumLiteralDeclaration_30()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31()); }
+(	'datamatrix' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_QRCODEEnumLiteralDeclaration_32()); }
+(	'qrcode' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_QRCODEEnumLiteralDeclaration_32()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UQRCODEEnumLiteralDeclaration_33()); }
+(	'uqrcode' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UQRCODEEnumLiteralDeclaration_33()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_AZTECEnumLiteralDeclaration_34()); }
+(	'aztec' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_AZTECEnumLiteralDeclaration_34()); }
+)
+
+    |(
+{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPDF417EnumLiteralDeclaration_35()); }
+(	'updf417' 
+)
+{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPDF417EnumLiteralDeclaration_35()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+rule__StatemachinePackage__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachinePackage__Group__0__Impl
+	rule__StatemachinePackage__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePackage__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getStatemachinePackageAction_0()); }
+(
+
+)
+{ after(grammarAccess.getStatemachinePackageAccess().getStatemachinePackageAction_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachinePackage__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachinePackage__Group__1__Impl
+	rule__StatemachinePackage__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePackage__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getPackageKeyword_1()); }
+
+	'package' 
+
+{ after(grammarAccess.getStatemachinePackageAccess().getPackageKeyword_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachinePackage__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachinePackage__Group__2__Impl
+	rule__StatemachinePackage__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePackage__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getNameAssignment_2()); }
+(rule__StatemachinePackage__NameAssignment_2)
+{ after(grammarAccess.getStatemachinePackageAccess().getNameAssignment_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachinePackage__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachinePackage__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePackage__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getGroup_3()); }
+(rule__StatemachinePackage__Group_3__0)?
+{ after(grammarAccess.getStatemachinePackageAccess().getGroup_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__StatemachinePackage__Group_3__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachinePackage__Group_3__0__Impl
+	rule__StatemachinePackage__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePackage__Group_3__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getLeftCurlyBracketKeyword_3_0()); }
+
+	'{' 
+
+{ after(grammarAccess.getStatemachinePackageAccess().getLeftCurlyBracketKeyword_3_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachinePackage__Group_3__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachinePackage__Group_3__1__Impl
+	rule__StatemachinePackage__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePackage__Group_3__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getImportsAssignment_3_1()); }
+(rule__StatemachinePackage__ImportsAssignment_3_1)*
+{ after(grammarAccess.getStatemachinePackageAccess().getImportsAssignment_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachinePackage__Group_3__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachinePackage__Group_3__2__Impl
+	rule__StatemachinePackage__Group_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePackage__Group_3__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getStatemachinesAssignment_3_2()); }
+(rule__StatemachinePackage__StatemachinesAssignment_3_2)*
+{ after(grammarAccess.getStatemachinePackageAccess().getStatemachinesAssignment_3_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachinePackage__Group_3__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachinePackage__Group_3__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachinePackage__Group_3__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachinePackageAccess().getRightCurlyBracketKeyword_3_3()); }
+
+	'}' 
+
+{ after(grammarAccess.getStatemachinePackageAccess().getRightCurlyBracketKeyword_3_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__Statemachine__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__0__Impl
+	rule__Statemachine__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getStatemachineKeyword_0()); }
+
+	'statemachine' 
+
+{ after(grammarAccess.getStatemachineAccess().getStatemachineKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__1__Impl
+	rule__Statemachine__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getNameAssignment_1()); }
+(rule__Statemachine__NameAssignment_1)
+{ after(grammarAccess.getStatemachineAccess().getNameAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__2__Impl
+	rule__Statemachine__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getGroup_2()); }
+(rule__Statemachine__Group_2__0)?
+{ after(grammarAccess.getStatemachineAccess().getGroup_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__3__Impl
+	rule__Statemachine__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getGroup_3()); }
+(rule__Statemachine__Group_3__0)?
+{ after(grammarAccess.getStatemachineAccess().getGroup_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__4__Impl
+	rule__Statemachine__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__4__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getInitialStateKeyword_4()); }
+
+	'initialState' 
+
+{ after(grammarAccess.getStatemachineAccess().getInitialStateKeyword_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__5
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__5__Impl
+	rule__Statemachine__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__5__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getInitialStateAssignment_5()); }
+(rule__Statemachine__InitialStateAssignment_5)
+{ after(grammarAccess.getStatemachineAccess().getInitialStateAssignment_5()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__6
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__6__Impl
+	rule__Statemachine__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__6__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getInitialEventKeyword_6()); }
+
+	'initialEvent' 
+
+{ after(grammarAccess.getStatemachineAccess().getInitialEventKeyword_6()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__7
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__7__Impl
+	rule__Statemachine__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__7__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getInitialEventAssignment_7()); }
+(rule__Statemachine__InitialEventAssignment_7)
+{ after(grammarAccess.getStatemachineAccess().getInitialEventAssignment_7()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__8
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__8__Impl
+	rule__Statemachine__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__8__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getGroup_8()); }
+(rule__Statemachine__Group_8__0)
+{ after(grammarAccess.getStatemachineAccess().getGroup_8()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__9
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__9__Impl
+	rule__Statemachine__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__9__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getGroup_9()); }
+(rule__Statemachine__Group_9__0)
+{ after(grammarAccess.getStatemachineAccess().getGroup_9()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__10
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group__10__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__10__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getGroup_10()); }
+(rule__Statemachine__Group_10__0)
+{ after(grammarAccess.getStatemachineAccess().getGroup_10()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+rule__Statemachine__Group_2__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_2__0__Impl
+	rule__Statemachine__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_2__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getDescriptionAssignment_2_0()); }
+(rule__Statemachine__DescriptionAssignment_2_0)
+{ after(grammarAccess.getStatemachineAccess().getDescriptionAssignment_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_2__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_2__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getDescriptionValueAssignment_2_1()); }
+(rule__Statemachine__DescriptionValueAssignment_2_1)
+{ after(grammarAccess.getStatemachineAccess().getDescriptionValueAssignment_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__Statemachine__Group_3__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_3__0__Impl
+	rule__Statemachine__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getFunctiongroupKeyword_3_0()); }
+
+	'functiongroup' 
+
+{ after(grammarAccess.getStatemachineAccess().getFunctiongroupKeyword_3_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_3__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getFunctionGroupAssignment_3_1()); }
+(rule__Statemachine__FunctionGroupAssignment_3_1)
+{ after(grammarAccess.getStatemachineAccess().getFunctionGroupAssignment_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__Statemachine__Group_8__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_8__0__Impl
+	rule__Statemachine__Group_8__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getEventsKeyword_8_0()); }
+
+	'events' 
+
+{ after(grammarAccess.getStatemachineAccess().getEventsKeyword_8_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_8__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getGroup_8_1()); }
+(rule__Statemachine__Group_8_1__0)
+{ after(grammarAccess.getStatemachineAccess().getGroup_8_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__Statemachine__Group_8_1__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_8_1__0__Impl
+	rule__Statemachine__Group_8_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_0()); }
+
+	'{' 
+
+{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_1__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_8_1__1__Impl
+	rule__Statemachine__Group_8_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getEventsAssignment_8_1_1()); }
+(rule__Statemachine__EventsAssignment_8_1_1)*
+{ after(grammarAccess.getStatemachineAccess().getEventsAssignment_8_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_1__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_8_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_2()); }
+
+	'}' 
+
+{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__Statemachine__Group_9__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_9__0__Impl
+	rule__Statemachine__Group_9__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getControlsKeyword_9_0()); }
+
+	'controls' 
+
+{ after(grammarAccess.getStatemachineAccess().getControlsKeyword_9_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_9__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_9__1__Impl
+	rule__Statemachine__Group_9__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_9_1()); }
+
+	'{' 
+
+{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_9_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_9__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_9__2__Impl
+	rule__Statemachine__Group_9__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getControlsAssignment_9_2()); }
+(rule__Statemachine__ControlsAssignment_9_2)*
+{ after(grammarAccess.getStatemachineAccess().getControlsAssignment_9_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_9__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_9__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_9_3()); }
+
+	'}' 
+
+{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_9_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__Statemachine__Group_10__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_10__0__Impl
+	rule__Statemachine__Group_10__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getStatesKeyword_10_0()); }
+
+	'states' 
+
+{ after(grammarAccess.getStatemachineAccess().getStatesKeyword_10_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_10__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_10__1__Impl
+	rule__Statemachine__Group_10__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_10_1()); }
+
+	'{' 
+
+{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_10_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_10__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_10__2__Impl
+	rule__Statemachine__Group_10__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getStatesAssignment_10_2()); }
+(rule__Statemachine__StatesAssignment_10_2)*
+{ after(grammarAccess.getStatemachineAccess().getStatesAssignment_10_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_10__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Statemachine__Group_10__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_10_3()); }
+
+	'}' 
+
+{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_10_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__StatemachineEvent__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineEvent__Group__0__Impl
+	rule__StatemachineEvent__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineEvent__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineEventAccess().getEventKeyword_0()); }
+
+	'event' 
+
+{ after(grammarAccess.getStatemachineEventAccess().getEventKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineEvent__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineEvent__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineEvent__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineEventAccess().getNameAssignment_1()); }
+(rule__StatemachineEvent__NameAssignment_1)
+{ after(grammarAccess.getStatemachineEventAccess().getNameAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__StatemachineState__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group__0__Impl
+	rule__StatemachineState__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getStateKeyword_0()); }
+
+	'state' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getStateKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group__1__Impl
+	rule__StatemachineState__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getNameAssignment_1()); }
+(rule__StatemachineState__NameAssignment_1)
+{ after(grammarAccess.getStatemachineStateAccess().getNameAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group__2__Impl
+	rule__StatemachineState__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_2()); }
+
+	'{' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group__3__Impl
+	rule__StatemachineState__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3()); }
+(rule__StatemachineState__UnorderedGroup_3)
+{ after(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group__4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group__4__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_4()); }
+
+	'}' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+rule__StatemachineState__Group_3_0__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_0__0__Impl
+	rule__StatemachineState__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_0__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getTriggersKeyword_3_0_0()); }
+
+	'triggers' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getTriggersKeyword_3_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group_3_0__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_0__1__Impl
+	rule__StatemachineState__Group_3_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_0__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_3_0_1()); }
+
+	'{' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_3_0_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group_3_0__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_0__2__Impl
+	rule__StatemachineState__Group_3_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_0__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getTriggersAssignment_3_0_2()); }
+(rule__StatemachineState__TriggersAssignment_3_0_2)*
+{ after(grammarAccess.getStatemachineStateAccess().getTriggersAssignment_3_0_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group_3_0__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_0__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_3_0_3()); }
+
+	'}' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_3_0_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__StatemachineState__Group_3_1__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_1__0__Impl
+	rule__StatemachineState__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_1__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getIdentityKeyword_3_1_0()); }
+
+	'identity' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getIdentityKeyword_3_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group_3_1__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_1__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getIdentityAssignment_3_1_1()); }
+(rule__StatemachineState__IdentityAssignment_3_1_1)
+{ after(grammarAccess.getStatemachineStateAccess().getIdentityAssignment_3_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__StatemachineState__Group_3_2__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_2__0__Impl
+	rule__StatemachineState__Group_3_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_2__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getKeystrokeKeyword_3_2_0()); }
+
+	'keystroke' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getKeystrokeKeyword_3_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group_3_2__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_2__1__Impl
+	rule__StatemachineState__Group_3_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_2__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getCommercialAtKeyword_3_2_1()); }
+
+	'@' 
+
+{ after(grammarAccess.getStatemachineStateAccess().getCommercialAtKeyword_3_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group_3_2__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_2__2__Impl
+	rule__StatemachineState__Group_3_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_2__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getKeystrokeAssignment_3_2_2()); }
+(rule__StatemachineState__KeystrokeAssignment_3_2_2)
+{ after(grammarAccess.getStatemachineStateAccess().getKeystrokeAssignment_3_2_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group_3_2__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_2__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getGroup_3_2_3()); }
+(rule__StatemachineState__Group_3_2_3__0)?
+{ after(grammarAccess.getStatemachineStateAccess().getGroup_3_2_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__StatemachineState__Group_3_2_3__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_2_3__0__Impl
+	rule__StatemachineState__Group_3_2_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_2_3__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getHasKeyOperationAssignment_3_2_3_0()); }
+(rule__StatemachineState__HasKeyOperationAssignment_3_2_3_0)
+{ after(grammarAccess.getStatemachineStateAccess().getHasKeyOperationAssignment_3_2_3_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineState__Group_3_2_3__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineState__Group_3_2_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineState__Group_3_2_3__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineStateAccess().getKeyOperationAssignment_3_2_3_1()); }
+(rule__StatemachineState__KeyOperationAssignment_3_2_3_1)
+{ after(grammarAccess.getStatemachineStateAccess().getKeyOperationAssignment_3_2_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__StatemachineTrigger__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__0__Impl
+	rule__StatemachineTrigger__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getStatemachineTriggerAction_0()); }
+(
+
+)
+{ after(grammarAccess.getStatemachineTriggerAccess().getStatemachineTriggerAction_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__1__Impl
+	rule__StatemachineTrigger__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getTriggerKeyword_1()); }
+
+	'trigger' 
+
+{ after(grammarAccess.getStatemachineTriggerAccess().getTriggerKeyword_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__2__Impl
+	rule__StatemachineTrigger__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getTriggersAssignment_2()); }
+(rule__StatemachineTrigger__TriggersAssignment_2)*
+{ after(grammarAccess.getStatemachineTriggerAccess().getTriggersAssignment_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__3__Impl
+	rule__StatemachineTrigger__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getGroup_3()); }
+(rule__StatemachineTrigger__Group_3__0)?
+{ after(grammarAccess.getStatemachineTriggerAccess().getGroup_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group__4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__4__Impl
+	rule__StatemachineTrigger__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__4__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getActionsKeyword_4()); }
+
+	'actions' 
+
+{ after(grammarAccess.getStatemachineTriggerAccess().getActionsKeyword_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group__5
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__5__Impl
+	rule__StatemachineTrigger__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__5__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getGroup_5()); }
+(rule__StatemachineTrigger__Group_5__0)?
+{ after(grammarAccess.getStatemachineTriggerAccess().getGroup_5()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group__6
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__6__Impl
+	rule__StatemachineTrigger__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__6__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_6()); }
+
+	'{' 
+
+{ after(grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_6()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group__7
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__7__Impl
+	rule__StatemachineTrigger__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__7__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getActionsAssignment_7()); }
+(rule__StatemachineTrigger__ActionsAssignment_7)*
+{ after(grammarAccess.getStatemachineTriggerAccess().getActionsAssignment_7()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group__8
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group__8__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_8()); }
+
+	'}' 
+
+{ after(grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_8()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+rule__StatemachineTrigger__Group_3__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group_3__0__Impl
+	rule__StatemachineTrigger__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group_3__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getGuardsKeyword_3_0()); }
+
+	'guards' 
+
+{ after(grammarAccess.getStatemachineTriggerAccess().getGuardsKeyword_3_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group_3__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group_3__1__Impl
+	rule__StatemachineTrigger__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group_3__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_3_1()); }
+
+	'{' 
+
+{ after(grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group_3__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group_3__2__Impl
+	rule__StatemachineTrigger__Group_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group_3__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getGuardsAssignment_3_2()); }
+(rule__StatemachineTrigger__GuardsAssignment_3_2)*
+{ after(grammarAccess.getStatemachineTriggerAccess().getGuardsAssignment_3_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group_3__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group_3__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group_3__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_3_3()); }
+
+	'}' 
+
+{ after(grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_3_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__StatemachineTrigger__Group_5__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group_5__0__Impl
+	rule__StatemachineTrigger__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group_5__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getHasTransitionAssignment_5_0()); }
+(rule__StatemachineTrigger__HasTransitionAssignment_5_0)
+{ after(grammarAccess.getStatemachineTriggerAccess().getHasTransitionAssignment_5_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineTrigger__Group_5__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineTrigger__Group_5__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineTrigger__Group_5__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineTriggerAccess().getTransitionAssignment_5_1()); }
+(rule__StatemachineTrigger__TransitionAssignment_5_1)
+{ after(grammarAccess.getStatemachineTriggerAccess().getTransitionAssignment_5_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__StatemachineActionPeripheralBlinkRate__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineActionPeripheralBlinkRate__Group__0__Impl
+	rule__StatemachineActionPeripheralBlinkRate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineActionPeripheralBlinkRate__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateKeyword_0()); }
+
+	'blinkRate' 
+
+{ after(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineActionPeripheralBlinkRate__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__StatemachineActionPeripheralBlinkRate__Group__1__Impl
+	rule__StatemachineActionPeripheralBlinkRate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineActionPeripheralBlinkRate__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateAssignment_1()); }
+(rule__StatemachineActionPeripheralBlinkRate__BlinkRateAssignment_1)
+{ after(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineActionPeripheralBlinkRate__Group__2
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.tokens b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.tokens
new file mode 100644
index 0000000..751c5fd
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.tokens
@@ -0,0 +1,525 @@
+'!'=40
+'!='=22
+'!=='=24
+'#'=238
+'%'=39
+'%='=20
+'&&'=15
+'&'=262
+'('=198
+')'=199
+'*'=36
+'**'=37
+'*='=18
+'+'=34
+'++'=41
+'+='=16
+','=212
+'-'=35
+'--'=42
+'-='=17
+'->'=28
+'.'=43
+'..'=30
+'..<'=29
+'/'=38
+'/='=19
+':'=246
+'::'=266
+';'=242
+'<'=27
+'<>'=32
+'='=13
+'=='=21
+'==='=23
+'=>'=31
+'>'=26
+'>='=25
+'?'=261
+'?.'=267
+'?:'=33
+'@'=147
+'Boolean'=51
+'Date'=56
+'Double'=54
+'Integer'=52
+'Long'=53
+'String'=55
+'SuggestText'=57
+'['=239
+']'=237
+'actions'=148
+'and'=264
+'as'=241
+'assistive'=79
+'aztec'=131
+'barcodeType'=176
+'blink'=87
+'blinkRate'=150
+'blinkreverse'=96
+'block'=82
+'button'=231
+'caption'=201
+'case'=248
+'cashDrawer'=228
+'catch'=260
+'clear'=214
+'clearDevice'=151
+'code128'=108
+'code128_parsed'=121
+'code39'=106
+'code93'=107
+'codeabar'=105
+'column'=154
+'configuration'=191
+'controls'=141
+'createWindow'=152
+'cursorType'=159
+'data'=175
+'dataProvider'=224
+'datamatrix'=128
+'default'=247
+'delay'=235
+'described by'=263
+'description'=202
+'destroyWindow'=160
+'deviceBrightness'=161
+'displayBitmap'=162
+'displayText'=164
+'displayTextAt'=166
+'do'=251
+'down'=89
+'dto'=210
+'ean128'=118
+'ean13'=102
+'ean13_s'=117
+'ean8'=100
+'ean8_s'=116
+'else'=244
+'error'=77
+'event'=143
+'events'=140
+'extends'=45
+'extension'=48
+'false'=50
+'field'=233
+'fields'=223
+'finally'=258
+'fixed'=81
+'for'=249
+'from'=195
+'function'=204
+'functiongroup'=139
+'get'=211
+'getBrowserLocale'=66
+'getIPAddress'=61
+'getNow'=62
+'getSceenWidth'=72
+'getScreenHeight'=73
+'getTrigger'=74
+'getUserAgentInfo'=63
+'getUserEmail'=69
+'getUserName'=67
+'getUserPassword'=68
+'getUserPosition'=70
+'getUserPrintService'=71
+'gs1databar'=122
+'gs1databar_e'=123
+'gs1databar_e_s'=125
+'gs1databar_s'=124
+'guard'=200
+'guards'=149
+'halfblock'=83
+'height'=155
+'host'=183
+'humanized'=75
+'id'=163
+'identity'=60
+'if'=243
+'image'=218
+'import'=47
+'in'=220
+'init'=92
+'initialEvent'=138
+'initialState'=137
+'instanceof'=240
+'interCharacterWait'=167
+'invisible'=217
+'isHttps'=65
+'isTouchDevice'=64
+'itf'=104
+'jan13'=101
+'jan8'=99
+'key'=232
+'keyboard'=58
+'keypad'=222
+'keystroke'=146
+'layout'=234
+'left'=90
+'lineDisplay'=226
+'marqueeFormat'=168
+'marqueeRepeatWait'=169
+'marqueeType'=170
+'marqueeUnitWait'=171
+'maxicode'=127
+'name'=181
+'new'=252
+'none'=80
+'normal'=95
+'null'=253
+'ocrb'=120
+'ofAmount'=193
+'ofReceipt'=189
+'onFail'=265
+'openDrawer'=173
+'operation'=197
+'orca'=119
+'other'=86
+'package'=133
+'payment'=229
+'paymentAcknowledge'=186
+'paymentAuthorization'=192
+'paymentClose'=185
+'paymentOpen'=182
+'paymentRegistration'=190
+'paymentResponse'=194
+'paymentReversal'=187
+'pdf417'=126
+'peripheral'=230
+'place'=94
+'port'=184
+'posPrinter'=227
+'printBarcode'=174
+'printBitmap'=177
+'printCut'=178
+'printNormal'=179
+'printReport'=196
+'qrcode'=129
+'registerBitmap'=180
+'remove'=215
+'retrieve'=207
+'return'=256
+'reverse'=85
+'right'=91
+'row'=153
+'schedule'=221
+'scheduler'=225
+'scroll'=172
+'search'=219
+'send'=236
+'set'=213
+'state'=144
+'statemachine'=136
+'states'=142
+'static'=46
+'store'=205
+'super'=49
+'switch'=245
+'synchronized'=259
+'text'=165
+'tf'=103
+'throw'=255
+'transition'=208
+'translate'=209
+'tray'=78
+'trigger'=59
+'triggers'=145
+'true'=270
+'try'=257
+'type'=203
+'typeof'=254
+'underline'=84
+'up'=88
+'upca'=97
+'upca_s'=109
+'upcb'=98
+'upcd1'=111
+'upcd2'=112
+'upcd3'=113
+'upcd4'=114
+'upcd5'=115
+'upce_s'=110
+'updf417'=132
+'uqrcode'=130
+'val'=44
+'var'=269
+'visible'=216
+'walk'=93
+'warning'=76
+'while'=250
+'width'=156
+'windowHeight'=157
+'windowWidth'=158
+'with'=206
+'withPassword'=188
+'{'=134
+'|'=268
+'||'=14
+'}'=135
+RULE_ANY_OTHER=12
+RULE_DECIMAL=8
+RULE_HEX=6
+RULE_ID=4
+RULE_INT=7
+RULE_ML_COMMENT=9
+RULE_SL_COMMENT=10
+RULE_STRING=5
+RULE_WS=11
+T__100=100
+T__101=101
+T__102=102
+T__103=103
+T__104=104
+T__105=105
+T__106=106
+T__107=107
+T__108=108
+T__109=109
+T__110=110
+T__111=111
+T__112=112
+T__113=113
+T__114=114
+T__115=115
+T__116=116
+T__117=117
+T__118=118
+T__119=119
+T__120=120
+T__121=121
+T__122=122
+T__123=123
+T__124=124
+T__125=125
+T__126=126
+T__127=127
+T__128=128
+T__129=129
+T__130=130
+T__131=131
+T__132=132
+T__133=133
+T__134=134
+T__135=135
+T__136=136
+T__137=137
+T__138=138
+T__139=139
+T__13=13
+T__140=140
+T__141=141
+T__142=142
+T__143=143
+T__144=144
+T__145=145
+T__146=146
+T__147=147
+T__148=148
+T__149=149
+T__14=14
+T__150=150
+T__151=151
+T__152=152
+T__153=153
+T__154=154
+T__155=155
+T__156=156
+T__157=157
+T__158=158
+T__159=159
+T__15=15
+T__160=160
+T__161=161
+T__162=162
+T__163=163
+T__164=164
+T__165=165
+T__166=166
+T__167=167
+T__168=168
+T__169=169
+T__16=16
+T__170=170
+T__171=171
+T__172=172
+T__173=173
+T__174=174
+T__175=175
+T__176=176
+T__177=177
+T__178=178
+T__179=179
+T__17=17
+T__180=180
+T__181=181
+T__182=182
+T__183=183
+T__184=184
+T__185=185
+T__186=186
+T__187=187
+T__188=188
+T__189=189
+T__18=18
+T__190=190
+T__191=191
+T__192=192
+T__193=193
+T__194=194
+T__195=195
+T__196=196
+T__197=197
+T__198=198
+T__199=199
+T__19=19
+T__200=200
+T__201=201
+T__202=202
+T__203=203
+T__204=204
+T__205=205
+T__206=206
+T__207=207
+T__208=208
+T__209=209
+T__20=20
+T__210=210
+T__211=211
+T__212=212
+T__213=213
+T__214=214
+T__215=215
+T__216=216
+T__217=217
+T__218=218
+T__219=219
+T__21=21
+T__220=220
+T__221=221
+T__222=222
+T__223=223
+T__224=224
+T__225=225
+T__226=226
+T__227=227
+T__228=228
+T__229=229
+T__22=22
+T__230=230
+T__231=231
+T__232=232
+T__233=233
+T__234=234
+T__235=235
+T__236=236
+T__237=237
+T__238=238
+T__239=239
+T__23=23
+T__240=240
+T__241=241
+T__242=242
+T__243=243
+T__244=244
+T__245=245
+T__246=246
+T__247=247
+T__248=248
+T__249=249
+T__24=24
+T__250=250
+T__251=251
+T__252=252
+T__253=253
+T__254=254
+T__255=255
+T__256=256
+T__257=257
+T__258=258
+T__259=259
+T__25=25
+T__260=260
+T__261=261
+T__262=262
+T__263=263
+T__264=264
+T__265=265
+T__266=266
+T__267=267
+T__268=268
+T__269=269
+T__26=26
+T__270=270
+T__27=27
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
+T__54=54
+T__55=55
+T__56=56
+T__57=57
+T__58=58
+T__59=59
+T__60=60
+T__61=61
+T__62=62
+T__63=63
+T__64=64
+T__65=65
+T__66=66
+T__67=67
+T__68=68
+T__69=69
+T__70=70
+T__71=71
+T__72=72
+T__73=73
+T__74=74
+T__75=75
+T__76=76
+T__77=77
+T__78=78
+T__79=79
+T__80=80
+T__81=81
+T__82=82
+T__83=83
+T__84=84
+T__85=85
+T__86=86
+T__87=87
+T__88=88
+T__89=89
+T__90=90
+T__91=91
+T__92=92
+T__93=93
+T__94=94
+T__95=95
+T__96=96
+T__97=97
+T__98=98
+T__99=99
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSLLexer.java b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSLLexer.java
new file mode 100644
index 0000000..624522d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSLLexer.java
@@ -0,0 +1,10014 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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 InternalStatemachineDSLLexer extends Lexer {
+    public static final int T__144=144;
+    public static final int T__265=265;
+    public static final int T__143=143;
+    public static final int T__264=264;
+    public static final int T__146=146;
+    public static final int T__267=267;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__266=266;
+    public static final int T__140=140;
+    public static final int T__261=261;
+    public static final int T__260=260;
+    public static final int T__142=142;
+    public static final int T__263=263;
+    public static final int T__141=141;
+    public static final int T__262=262;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__258=258;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__257=257;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__259=259;
+    public static final int T__133=133;
+    public static final int T__254=254;
+    public static final int T__132=132;
+    public static final int T__253=253;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__256=256;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int T__255=255;
+    public static final int T__250=250;
+    public static final int RULE_ID=4;
+    public static final int T__131=131;
+    public static final int T__252=252;
+    public static final int T__130=130;
+    public static final int T__251=251;
+    public static final int RULE_INT=7;
+    public static final int T__66=66;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__247=247;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__246=246;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__249=249;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__248=248;
+    public static final int T__166=166;
+    public static final int T__165=165;
+    public static final int T__168=168;
+    public static final int T__167=167;
+    public static final int T__162=162;
+    public static final int T__161=161;
+    public static final int T__164=164;
+    public static final int T__163=163;
+    public static final int T__160=160;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__159=159;
+    public static final int T__30=30;
+    public static final int T__158=158;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__154=154;
+    public static final int T__157=157;
+    public static final int T__156=156;
+    public static final int T__151=151;
+    public static final int T__150=150;
+    public static final int T__153=153;
+    public static final int T__152=152;
+    public static final int T__270=270;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__269=269;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__268=268;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__100=100;
+    public static final int T__221=221;
+    public static final int T__220=220;
+    public static final int T__102=102;
+    public static final int T__223=223;
+    public static final int T__101=101;
+    public static final int T__222=222;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__218=218;
+    public static final int T__217=217;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__219=219;
+    public static final int T__214=214;
+    public static final int T__213=213;
+    public static final int T__216=216;
+    public static final int T__215=215;
+    public static final int T__210=210;
+    public static final int T__212=212;
+    public static final int T__211=211;
+    public static final int RULE_DECIMAL=8;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__207=207;
+    public static final int T__23=23;
+    public static final int T__206=206;
+    public static final int T__24=24;
+    public static final int T__209=209;
+    public static final int T__25=25;
+    public static final int T__208=208;
+    public static final int T__203=203;
+    public static final int T__202=202;
+    public static final int T__20=20;
+    public static final int T__205=205;
+    public static final int T__21=21;
+    public static final int T__204=204;
+    public static final int T__122=122;
+    public static final int T__243=243;
+    public static final int T__121=121;
+    public static final int T__242=242;
+    public static final int T__124=124;
+    public static final int T__245=245;
+    public static final int T__123=123;
+    public static final int T__244=244;
+    public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__119=119;
+    public static final int T__118=118;
+    public static final int T__239=239;
+    public static final int T__115=115;
+    public static final int T__236=236;
+    public static final int EOF=-1;
+    public static final int T__114=114;
+    public static final int T__235=235;
+    public static final int T__117=117;
+    public static final int T__238=238;
+    public static final int T__116=116;
+    public static final int T__237=237;
+    public static final int T__111=111;
+    public static final int T__232=232;
+    public static final int T__110=110;
+    public static final int T__231=231;
+    public static final int T__113=113;
+    public static final int T__234=234;
+    public static final int T__112=112;
+    public static final int T__233=233;
+    public static final int T__230=230;
+    public static final int T__108=108;
+    public static final int T__229=229;
+    public static final int T__107=107;
+    public static final int T__228=228;
+    public static final int T__109=109;
+    public static final int T__104=104;
+    public static final int T__225=225;
+    public static final int T__103=103;
+    public static final int T__224=224;
+    public static final int T__106=106;
+    public static final int T__227=227;
+    public static final int T__105=105;
+    public static final int T__226=226;
+    public static final int RULE_HEX=6;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__201=201;
+    public static final int T__200=200;
+    public static final int T__91=91;
+    public static final int T__188=188;
+    public static final int T__92=92;
+    public static final int T__187=187;
+    public static final int T__93=93;
+    public static final int T__94=94;
+    public static final int T__189=189;
+    public static final int T__184=184;
+    public static final int T__183=183;
+    public static final int T__186=186;
+    public static final int T__90=90;
+    public static final int T__185=185;
+    public static final int T__180=180;
+    public static final int T__182=182;
+    public static final int T__181=181;
+    public static final int T__99=99;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
+    public static final int T__169=169;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=5;
+    public static final int T__77=77;
+    public static final int T__78=78;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__74=74;
+    public static final int T__75=75;
+    public static final int T__76=76;
+    public static final int T__80=80;
+    public static final int T__199=199;
+    public static final int T__81=81;
+    public static final int T__198=198;
+    public static final int T__82=82;
+    public static final int T__83=83;
+    public static final int T__195=195;
+    public static final int T__194=194;
+    public static final int RULE_WS=11;
+    public static final int T__197=197;
+    public static final int T__196=196;
+    public static final int T__191=191;
+    public static final int T__190=190;
+    public static final int T__193=193;
+    public static final int T__192=192;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__89=89;
+    public static final int T__84=84;
+    public static final int T__85=85;
+    public static final int T__86=86;
+    public static final int T__87=87;
+
+    // delegates
+    // delegators
+
+    public InternalStatemachineDSLLexer() {;} 
+    public InternalStatemachineDSLLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalStatemachineDSLLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:11:7: ( '=' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:12:7: ( '||' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:13:7: ( '&&' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:14:7: ( '+=' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:14:9: '+='
+            {
+            match("+="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:15:7: ( '-=' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:16:7: ( '*=' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:16:9: '*='
+            {
+            match("*="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:17:7: ( '/=' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:17:9: '/='
+            {
+            match("/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:18:7: ( '%=' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:19:7: ( '==' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:19:9: '=='
+            {
+            match("=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "T__22"
+    public final void mT__22() throws RecognitionException {
+        try {
+            int _type = T__22;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:20:7: ( '!=' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:21:7: ( '===' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:22:7: ( '!==' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:22:9: '!=='
+            {
+            match("!=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__24"
+
+    // $ANTLR start "T__25"
+    public final void mT__25() throws RecognitionException {
+        try {
+            int _type = T__25;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:23:7: ( '>=' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:24:7: ( '>' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:25:7: ( '<' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:25:9: '<'
+            {
+            match('<'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__27"
+
+    // $ANTLR start "T__28"
+    public final void mT__28() throws RecognitionException {
+        try {
+            int _type = T__28;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:26:7: ( '->' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:27:7: ( '..<' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:27:9: '..<'
+            {
+            match("..<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__29"
+
+    // $ANTLR start "T__30"
+    public final void mT__30() throws RecognitionException {
+        try {
+            int _type = T__30;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:28:7: ( '..' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:29:7: ( '=>' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:29:9: '=>'
+            {
+            match("=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__31"
+
+    // $ANTLR start "T__32"
+    public final void mT__32() throws RecognitionException {
+        try {
+            int _type = T__32;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:30:7: ( '<>' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:30:9: '<>'
+            {
+            match("<>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__32"
+
+    // $ANTLR start "T__33"
+    public final void mT__33() throws RecognitionException {
+        try {
+            int _type = T__33;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:31:7: ( '?:' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:31:9: '?:'
+            {
+            match("?:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__33"
+
+    // $ANTLR start "T__34"
+    public final void mT__34() throws RecognitionException {
+        try {
+            int _type = T__34;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:32:7: ( '+' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:33:7: ( '-' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:33:9: '-'
+            {
+            match('-'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__35"
+
+    // $ANTLR start "T__36"
+    public final void mT__36() throws RecognitionException {
+        try {
+            int _type = T__36;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:34:7: ( '*' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:34:9: '*'
+            {
+            match('*'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__36"
+
+    // $ANTLR start "T__37"
+    public final void mT__37() throws RecognitionException {
+        try {
+            int _type = T__37;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:35:7: ( '**' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:35:9: '**'
+            {
+            match("**"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__37"
+
+    // $ANTLR start "T__38"
+    public final void mT__38() throws RecognitionException {
+        try {
+            int _type = T__38;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:36:7: ( '/' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:36:9: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__38"
+
+    // $ANTLR start "T__39"
+    public final void mT__39() throws RecognitionException {
+        try {
+            int _type = T__39;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:37:7: ( '%' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:37:9: '%'
+            {
+            match('%'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__39"
+
+    // $ANTLR start "T__40"
+    public final void mT__40() throws RecognitionException {
+        try {
+            int _type = T__40;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:38:7: ( '!' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:38:9: '!'
+            {
+            match('!'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__40"
+
+    // $ANTLR start "T__41"
+    public final void mT__41() throws RecognitionException {
+        try {
+            int _type = T__41;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:39:7: ( '++' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:40:7: ( '--' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41:7: ( '.' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__43"
+
+    // $ANTLR start "T__44"
+    public final void mT__44() throws RecognitionException {
+        try {
+            int _type = T__44;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:42:7: ( 'val' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:42:9: 'val'
+            {
+            match("val"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__44"
+
+    // $ANTLR start "T__45"
+    public final void mT__45() throws RecognitionException {
+        try {
+            int _type = T__45;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:43:7: ( 'extends' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:43:9: 'extends'
+            {
+            match("extends"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__45"
+
+    // $ANTLR start "T__46"
+    public final void mT__46() throws RecognitionException {
+        try {
+            int _type = T__46;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:44:7: ( 'static' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:44:9: 'static'
+            {
+            match("static"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__46"
+
+    // $ANTLR start "T__47"
+    public final void mT__47() throws RecognitionException {
+        try {
+            int _type = T__47;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:45:7: ( 'import' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:45:9: 'import'
+            {
+            match("import"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__47"
+
+    // $ANTLR start "T__48"
+    public final void mT__48() throws RecognitionException {
+        try {
+            int _type = T__48;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:46:7: ( 'extension' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:46:9: 'extension'
+            {
+            match("extension"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__48"
+
+    // $ANTLR start "T__49"
+    public final void mT__49() throws RecognitionException {
+        try {
+            int _type = T__49;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:47:7: ( 'super' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:47:9: 'super'
+            {
+            match("super"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__49"
+
+    // $ANTLR start "T__50"
+    public final void mT__50() throws RecognitionException {
+        try {
+            int _type = T__50;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:48:7: ( 'false' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:48:9: 'false'
+            {
+            match("false"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__50"
+
+    // $ANTLR start "T__51"
+    public final void mT__51() throws RecognitionException {
+        try {
+            int _type = T__51;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:49:7: ( 'Boolean' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:49:9: 'Boolean'
+            {
+            match("Boolean"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:50:7: ( 'Integer' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:50:9: 'Integer'
+            {
+            match("Integer"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:51:7: ( 'Long' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:51:9: 'Long'
+            {
+            match("Long"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:52:7: ( 'Double' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:52:9: 'Double'
+            {
+            match("Double"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:53:7: ( 'String' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:53:9: 'String'
+            {
+            match("String"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:54:7: ( 'Date' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:54:9: 'Date'
+            {
+            match("Date"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:55:7: ( 'SuggestText' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:55:9: 'SuggestText'
+            {
+            match("SuggestText"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:56:7: ( 'keyboard' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:56:9: 'keyboard'
+            {
+            match("keyboard"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:57:7: ( 'trigger' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:57:9: 'trigger'
+            {
+            match("trigger"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:58:7: ( 'identity' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:58:9: 'identity'
+            {
+            match("identity"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:59:7: ( 'getIPAddress' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:59:9: 'getIPAddress'
+            {
+            match("getIPAddress"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:60:7: ( 'getNow' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:60:9: 'getNow'
+            {
+            match("getNow"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:61:7: ( 'getUserAgentInfo' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:61:9: 'getUserAgentInfo'
+            {
+            match("getUserAgentInfo"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:62:7: ( 'isTouchDevice' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:62:9: 'isTouchDevice'
+            {
+            match("isTouchDevice"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:63:7: ( 'isHttps' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:63:9: 'isHttps'
+            {
+            match("isHttps"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:64:7: ( 'getBrowserLocale' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:64:9: 'getBrowserLocale'
+            {
+            match("getBrowserLocale"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:65:7: ( 'getUserName' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:65:9: 'getUserName'
+            {
+            match("getUserName"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:66:7: ( 'getUserPassword' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:66:9: 'getUserPassword'
+            {
+            match("getUserPassword"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:67:7: ( 'getUserEmail' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:67:9: 'getUserEmail'
+            {
+            match("getUserEmail"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:68:7: ( 'getUserPosition' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:68:9: 'getUserPosition'
+            {
+            match("getUserPosition"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:69:7: ( 'getUserPrintService' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:69:9: 'getUserPrintService'
+            {
+            match("getUserPrintService"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:70:7: ( 'getSceenWidth' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:70:9: 'getSceenWidth'
+            {
+            match("getSceenWidth"); 
+
+
+            }
+
+            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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:71:7: ( 'getScreenHeight' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:71:9: 'getScreenHeight'
+            {
+            match("getScreenHeight"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__73"
+
+    // $ANTLR start "T__74"
+    public final void mT__74() throws RecognitionException {
+        try {
+            int _type = T__74;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:72:7: ( 'getTrigger' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:72:9: 'getTrigger'
+            {
+            match("getTrigger"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__74"
+
+    // $ANTLR start "T__75"
+    public final void mT__75() throws RecognitionException {
+        try {
+            int _type = T__75;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:73:7: ( 'humanized' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:73:9: 'humanized'
+            {
+            match("humanized"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__75"
+
+    // $ANTLR start "T__76"
+    public final void mT__76() throws RecognitionException {
+        try {
+            int _type = T__76;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:74:7: ( 'warning' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:74:9: 'warning'
+            {
+            match("warning"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__76"
+
+    // $ANTLR start "T__77"
+    public final void mT__77() throws RecognitionException {
+        try {
+            int _type = T__77;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:75:7: ( 'error' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:75:9: 'error'
+            {
+            match("error"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__77"
+
+    // $ANTLR start "T__78"
+    public final void mT__78() throws RecognitionException {
+        try {
+            int _type = T__78;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:76:7: ( 'tray' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:76:9: 'tray'
+            {
+            match("tray"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__78"
+
+    // $ANTLR start "T__79"
+    public final void mT__79() throws RecognitionException {
+        try {
+            int _type = T__79;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:77:7: ( 'assistive' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:77:9: 'assistive'
+            {
+            match("assistive"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__79"
+
+    // $ANTLR start "T__80"
+    public final void mT__80() throws RecognitionException {
+        try {
+            int _type = T__80;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:78:7: ( 'none' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:78:9: 'none'
+            {
+            match("none"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__80"
+
+    // $ANTLR start "T__81"
+    public final void mT__81() throws RecognitionException {
+        try {
+            int _type = T__81;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:79:7: ( 'fixed' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:79:9: 'fixed'
+            {
+            match("fixed"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__81"
+
+    // $ANTLR start "T__82"
+    public final void mT__82() throws RecognitionException {
+        try {
+            int _type = T__82;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:80:7: ( 'block' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:80:9: 'block'
+            {
+            match("block"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__82"
+
+    // $ANTLR start "T__83"
+    public final void mT__83() throws RecognitionException {
+        try {
+            int _type = T__83;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:81:7: ( 'halfblock' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:81:9: 'halfblock'
+            {
+            match("halfblock"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__83"
+
+    // $ANTLR start "T__84"
+    public final void mT__84() throws RecognitionException {
+        try {
+            int _type = T__84;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:82:7: ( 'underline' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:82:9: 'underline'
+            {
+            match("underline"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__84"
+
+    // $ANTLR start "T__85"
+    public final void mT__85() throws RecognitionException {
+        try {
+            int _type = T__85;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:83:7: ( 'reverse' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:83:9: 'reverse'
+            {
+            match("reverse"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__85"
+
+    // $ANTLR start "T__86"
+    public final void mT__86() throws RecognitionException {
+        try {
+            int _type = T__86;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:84:7: ( 'other' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:84:9: 'other'
+            {
+            match("other"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__86"
+
+    // $ANTLR start "T__87"
+    public final void mT__87() throws RecognitionException {
+        try {
+            int _type = T__87;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:85:7: ( 'blink' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:85:9: 'blink'
+            {
+            match("blink"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__87"
+
+    // $ANTLR start "T__88"
+    public final void mT__88() throws RecognitionException {
+        try {
+            int _type = T__88;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:86:7: ( 'up' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:86:9: 'up'
+            {
+            match("up"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__88"
+
+    // $ANTLR start "T__89"
+    public final void mT__89() throws RecognitionException {
+        try {
+            int _type = T__89;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:87:7: ( 'down' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:87:9: 'down'
+            {
+            match("down"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__89"
+
+    // $ANTLR start "T__90"
+    public final void mT__90() throws RecognitionException {
+        try {
+            int _type = T__90;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:88:7: ( 'left' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:88:9: 'left'
+            {
+            match("left"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__90"
+
+    // $ANTLR start "T__91"
+    public final void mT__91() throws RecognitionException {
+        try {
+            int _type = T__91;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:89:7: ( 'right' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:89:9: 'right'
+            {
+            match("right"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__91"
+
+    // $ANTLR start "T__92"
+    public final void mT__92() throws RecognitionException {
+        try {
+            int _type = T__92;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:90:7: ( 'init' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:90:9: 'init'
+            {
+            match("init"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__92"
+
+    // $ANTLR start "T__93"
+    public final void mT__93() throws RecognitionException {
+        try {
+            int _type = T__93;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:91:7: ( 'walk' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:91:9: 'walk'
+            {
+            match("walk"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__93"
+
+    // $ANTLR start "T__94"
+    public final void mT__94() throws RecognitionException {
+        try {
+            int _type = T__94;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:92:7: ( 'place' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:92:9: 'place'
+            {
+            match("place"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__94"
+
+    // $ANTLR start "T__95"
+    public final void mT__95() throws RecognitionException {
+        try {
+            int _type = T__95;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:93:7: ( 'normal' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:93:9: 'normal'
+            {
+            match("normal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__95"
+
+    // $ANTLR start "T__96"
+    public final void mT__96() throws RecognitionException {
+        try {
+            int _type = T__96;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:94:7: ( 'blinkreverse' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:94:9: 'blinkreverse'
+            {
+            match("blinkreverse"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__96"
+
+    // $ANTLR start "T__97"
+    public final void mT__97() throws RecognitionException {
+        try {
+            int _type = T__97;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:95:7: ( 'upca' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:95:9: 'upca'
+            {
+            match("upca"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__97"
+
+    // $ANTLR start "T__98"
+    public final void mT__98() throws RecognitionException {
+        try {
+            int _type = T__98;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:96:7: ( 'upcb' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:96:9: 'upcb'
+            {
+            match("upcb"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__98"
+
+    // $ANTLR start "T__99"
+    public final void mT__99() throws RecognitionException {
+        try {
+            int _type = T__99;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:97:7: ( 'jan8' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:97:9: 'jan8'
+            {
+            match("jan8"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__99"
+
+    // $ANTLR start "T__100"
+    public final void mT__100() throws RecognitionException {
+        try {
+            int _type = T__100;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:98:8: ( 'ean8' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:98:10: 'ean8'
+            {
+            match("ean8"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__100"
+
+    // $ANTLR start "T__101"
+    public final void mT__101() throws RecognitionException {
+        try {
+            int _type = T__101;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:99:8: ( 'jan13' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:99:10: 'jan13'
+            {
+            match("jan13"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__101"
+
+    // $ANTLR start "T__102"
+    public final void mT__102() throws RecognitionException {
+        try {
+            int _type = T__102;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:100:8: ( 'ean13' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:100:10: 'ean13'
+            {
+            match("ean13"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__102"
+
+    // $ANTLR start "T__103"
+    public final void mT__103() throws RecognitionException {
+        try {
+            int _type = T__103;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:101:8: ( 'tf' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:101:10: 'tf'
+            {
+            match("tf"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__103"
+
+    // $ANTLR start "T__104"
+    public final void mT__104() throws RecognitionException {
+        try {
+            int _type = T__104;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:102:8: ( 'itf' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:102:10: 'itf'
+            {
+            match("itf"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__104"
+
+    // $ANTLR start "T__105"
+    public final void mT__105() throws RecognitionException {
+        try {
+            int _type = T__105;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:103:8: ( 'codeabar' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:103:10: 'codeabar'
+            {
+            match("codeabar"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__105"
+
+    // $ANTLR start "T__106"
+    public final void mT__106() throws RecognitionException {
+        try {
+            int _type = T__106;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:104:8: ( 'code39' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:104:10: 'code39'
+            {
+            match("code39"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__106"
+
+    // $ANTLR start "T__107"
+    public final void mT__107() throws RecognitionException {
+        try {
+            int _type = T__107;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:105:8: ( 'code93' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:105:10: 'code93'
+            {
+            match("code93"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__107"
+
+    // $ANTLR start "T__108"
+    public final void mT__108() throws RecognitionException {
+        try {
+            int _type = T__108;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:106:8: ( 'code128' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:106:10: 'code128'
+            {
+            match("code128"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__108"
+
+    // $ANTLR start "T__109"
+    public final void mT__109() throws RecognitionException {
+        try {
+            int _type = T__109;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:107:8: ( 'upca_s' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:107:10: 'upca_s'
+            {
+            match("upca_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__109"
+
+    // $ANTLR start "T__110"
+    public final void mT__110() throws RecognitionException {
+        try {
+            int _type = T__110;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:108:8: ( 'upce_s' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:108:10: 'upce_s'
+            {
+            match("upce_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__110"
+
+    // $ANTLR start "T__111"
+    public final void mT__111() throws RecognitionException {
+        try {
+            int _type = T__111;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:109:8: ( 'upcd1' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:109:10: 'upcd1'
+            {
+            match("upcd1"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__111"
+
+    // $ANTLR start "T__112"
+    public final void mT__112() throws RecognitionException {
+        try {
+            int _type = T__112;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:110:8: ( 'upcd2' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:110:10: 'upcd2'
+            {
+            match("upcd2"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__112"
+
+    // $ANTLR start "T__113"
+    public final void mT__113() throws RecognitionException {
+        try {
+            int _type = T__113;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:111:8: ( 'upcd3' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:111:10: 'upcd3'
+            {
+            match("upcd3"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__113"
+
+    // $ANTLR start "T__114"
+    public final void mT__114() throws RecognitionException {
+        try {
+            int _type = T__114;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:112:8: ( 'upcd4' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:112:10: 'upcd4'
+            {
+            match("upcd4"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__114"
+
+    // $ANTLR start "T__115"
+    public final void mT__115() throws RecognitionException {
+        try {
+            int _type = T__115;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:113:8: ( 'upcd5' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:113:10: 'upcd5'
+            {
+            match("upcd5"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__115"
+
+    // $ANTLR start "T__116"
+    public final void mT__116() throws RecognitionException {
+        try {
+            int _type = T__116;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:114:8: ( 'ean8_s' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:114:10: 'ean8_s'
+            {
+            match("ean8_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__116"
+
+    // $ANTLR start "T__117"
+    public final void mT__117() throws RecognitionException {
+        try {
+            int _type = T__117;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:115:8: ( 'ean13_s' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:115:10: 'ean13_s'
+            {
+            match("ean13_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__117"
+
+    // $ANTLR start "T__118"
+    public final void mT__118() throws RecognitionException {
+        try {
+            int _type = T__118;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:116:8: ( 'ean128' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:116:10: 'ean128'
+            {
+            match("ean128"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__118"
+
+    // $ANTLR start "T__119"
+    public final void mT__119() throws RecognitionException {
+        try {
+            int _type = T__119;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:117:8: ( 'orca' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:117:10: 'orca'
+            {
+            match("orca"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__119"
+
+    // $ANTLR start "T__120"
+    public final void mT__120() throws RecognitionException {
+        try {
+            int _type = T__120;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:118:8: ( 'ocrb' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:118:10: 'ocrb'
+            {
+            match("ocrb"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__120"
+
+    // $ANTLR start "T__121"
+    public final void mT__121() throws RecognitionException {
+        try {
+            int _type = T__121;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:119:8: ( 'code128_parsed' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:119:10: 'code128_parsed'
+            {
+            match("code128_parsed"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__121"
+
+    // $ANTLR start "T__122"
+    public final void mT__122() throws RecognitionException {
+        try {
+            int _type = T__122;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:120:8: ( 'gs1databar' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:120:10: 'gs1databar'
+            {
+            match("gs1databar"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__122"
+
+    // $ANTLR start "T__123"
+    public final void mT__123() throws RecognitionException {
+        try {
+            int _type = T__123;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:121:8: ( 'gs1databar_e' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:121:10: 'gs1databar_e'
+            {
+            match("gs1databar_e"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__123"
+
+    // $ANTLR start "T__124"
+    public final void mT__124() throws RecognitionException {
+        try {
+            int _type = T__124;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:122:8: ( 'gs1databar_s' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:122:10: 'gs1databar_s'
+            {
+            match("gs1databar_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__124"
+
+    // $ANTLR start "T__125"
+    public final void mT__125() throws RecognitionException {
+        try {
+            int _type = T__125;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:123:8: ( 'gs1databar_e_s' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:123:10: 'gs1databar_e_s'
+            {
+            match("gs1databar_e_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__125"
+
+    // $ANTLR start "T__126"
+    public final void mT__126() throws RecognitionException {
+        try {
+            int _type = T__126;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:124:8: ( 'pdf417' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:124:10: 'pdf417'
+            {
+            match("pdf417"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__126"
+
+    // $ANTLR start "T__127"
+    public final void mT__127() throws RecognitionException {
+        try {
+            int _type = T__127;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:125:8: ( 'maxicode' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:125:10: 'maxicode'
+            {
+            match("maxicode"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__127"
+
+    // $ANTLR start "T__128"
+    public final void mT__128() throws RecognitionException {
+        try {
+            int _type = T__128;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:126:8: ( 'datamatrix' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:126:10: 'datamatrix'
+            {
+            match("datamatrix"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__128"
+
+    // $ANTLR start "T__129"
+    public final void mT__129() throws RecognitionException {
+        try {
+            int _type = T__129;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:127:8: ( 'qrcode' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:127:10: 'qrcode'
+            {
+            match("qrcode"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__129"
+
+    // $ANTLR start "T__130"
+    public final void mT__130() throws RecognitionException {
+        try {
+            int _type = T__130;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:128:8: ( 'uqrcode' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:128:10: 'uqrcode'
+            {
+            match("uqrcode"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__130"
+
+    // $ANTLR start "T__131"
+    public final void mT__131() throws RecognitionException {
+        try {
+            int _type = T__131;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:129:8: ( 'aztec' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:129:10: 'aztec'
+            {
+            match("aztec"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__131"
+
+    // $ANTLR start "T__132"
+    public final void mT__132() throws RecognitionException {
+        try {
+            int _type = T__132;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:130:8: ( 'updf417' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:130:10: 'updf417'
+            {
+            match("updf417"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__132"
+
+    // $ANTLR start "T__133"
+    public final void mT__133() throws RecognitionException {
+        try {
+            int _type = T__133;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:131:8: ( 'package' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:131:10: 'package'
+            {
+            match("package"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__133"
+
+    // $ANTLR start "T__134"
+    public final void mT__134() throws RecognitionException {
+        try {
+            int _type = T__134;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:132:8: ( '{' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:132:10: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__134"
+
+    // $ANTLR start "T__135"
+    public final void mT__135() throws RecognitionException {
+        try {
+            int _type = T__135;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:133:8: ( '}' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:133:10: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__135"
+
+    // $ANTLR start "T__136"
+    public final void mT__136() throws RecognitionException {
+        try {
+            int _type = T__136;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:134:8: ( 'statemachine' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:134:10: 'statemachine'
+            {
+            match("statemachine"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__136"
+
+    // $ANTLR start "T__137"
+    public final void mT__137() throws RecognitionException {
+        try {
+            int _type = T__137;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:135:8: ( 'initialState' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:135:10: 'initialState'
+            {
+            match("initialState"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__137"
+
+    // $ANTLR start "T__138"
+    public final void mT__138() throws RecognitionException {
+        try {
+            int _type = T__138;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:136:8: ( 'initialEvent' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:136:10: 'initialEvent'
+            {
+            match("initialEvent"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__138"
+
+    // $ANTLR start "T__139"
+    public final void mT__139() throws RecognitionException {
+        try {
+            int _type = T__139;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:137:8: ( 'functiongroup' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:137:10: 'functiongroup'
+            {
+            match("functiongroup"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__139"
+
+    // $ANTLR start "T__140"
+    public final void mT__140() throws RecognitionException {
+        try {
+            int _type = T__140;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:138:8: ( 'events' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:138:10: 'events'
+            {
+            match("events"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__140"
+
+    // $ANTLR start "T__141"
+    public final void mT__141() throws RecognitionException {
+        try {
+            int _type = T__141;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:139:8: ( 'controls' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:139:10: 'controls'
+            {
+            match("controls"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__141"
+
+    // $ANTLR start "T__142"
+    public final void mT__142() throws RecognitionException {
+        try {
+            int _type = T__142;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:140:8: ( 'states' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:140:10: 'states'
+            {
+            match("states"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__142"
+
+    // $ANTLR start "T__143"
+    public final void mT__143() throws RecognitionException {
+        try {
+            int _type = T__143;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:141:8: ( 'event' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:141:10: 'event'
+            {
+            match("event"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__143"
+
+    // $ANTLR start "T__144"
+    public final void mT__144() throws RecognitionException {
+        try {
+            int _type = T__144;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:142:8: ( 'state' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:142:10: 'state'
+            {
+            match("state"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__144"
+
+    // $ANTLR start "T__145"
+    public final void mT__145() throws RecognitionException {
+        try {
+            int _type = T__145;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:143:8: ( 'triggers' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:143:10: 'triggers'
+            {
+            match("triggers"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__145"
+
+    // $ANTLR start "T__146"
+    public final void mT__146() throws RecognitionException {
+        try {
+            int _type = T__146;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:144:8: ( 'keystroke' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:144:10: 'keystroke'
+            {
+            match("keystroke"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__146"
+
+    // $ANTLR start "T__147"
+    public final void mT__147() throws RecognitionException {
+        try {
+            int _type = T__147;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:145:8: ( '@' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:145:10: '@'
+            {
+            match('@'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__147"
+
+    // $ANTLR start "T__148"
+    public final void mT__148() throws RecognitionException {
+        try {
+            int _type = T__148;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:146:8: ( 'actions' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:146:10: 'actions'
+            {
+            match("actions"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__148"
+
+    // $ANTLR start "T__149"
+    public final void mT__149() throws RecognitionException {
+        try {
+            int _type = T__149;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:147:8: ( 'guards' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:147:10: 'guards'
+            {
+            match("guards"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__149"
+
+    // $ANTLR start "T__150"
+    public final void mT__150() throws RecognitionException {
+        try {
+            int _type = T__150;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:148:8: ( 'blinkRate' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:148:10: 'blinkRate'
+            {
+            match("blinkRate"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__150"
+
+    // $ANTLR start "T__151"
+    public final void mT__151() throws RecognitionException {
+        try {
+            int _type = T__151;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:149:8: ( 'clearDevice' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:149:10: 'clearDevice'
+            {
+            match("clearDevice"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__151"
+
+    // $ANTLR start "T__152"
+    public final void mT__152() throws RecognitionException {
+        try {
+            int _type = T__152;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:150:8: ( 'createWindow' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:150:10: 'createWindow'
+            {
+            match("createWindow"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__152"
+
+    // $ANTLR start "T__153"
+    public final void mT__153() throws RecognitionException {
+        try {
+            int _type = T__153;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:151:8: ( 'row' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:151:10: 'row'
+            {
+            match("row"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__153"
+
+    // $ANTLR start "T__154"
+    public final void mT__154() throws RecognitionException {
+        try {
+            int _type = T__154;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:152:8: ( 'column' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:152:10: 'column'
+            {
+            match("column"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__154"
+
+    // $ANTLR start "T__155"
+    public final void mT__155() throws RecognitionException {
+        try {
+            int _type = T__155;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:153:8: ( 'height' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:153:10: 'height'
+            {
+            match("height"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__155"
+
+    // $ANTLR start "T__156"
+    public final void mT__156() throws RecognitionException {
+        try {
+            int _type = T__156;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:154:8: ( 'width' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:154:10: 'width'
+            {
+            match("width"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__156"
+
+    // $ANTLR start "T__157"
+    public final void mT__157() throws RecognitionException {
+        try {
+            int _type = T__157;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:155:8: ( 'windowHeight' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:155:10: 'windowHeight'
+            {
+            match("windowHeight"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__157"
+
+    // $ANTLR start "T__158"
+    public final void mT__158() throws RecognitionException {
+        try {
+            int _type = T__158;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:156:8: ( 'windowWidth' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:156:10: 'windowWidth'
+            {
+            match("windowWidth"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__158"
+
+    // $ANTLR start "T__159"
+    public final void mT__159() throws RecognitionException {
+        try {
+            int _type = T__159;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:157:8: ( 'cursorType' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:157:10: 'cursorType'
+            {
+            match("cursorType"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__159"
+
+    // $ANTLR start "T__160"
+    public final void mT__160() throws RecognitionException {
+        try {
+            int _type = T__160;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:158:8: ( 'destroyWindow' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:158:10: 'destroyWindow'
+            {
+            match("destroyWindow"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__160"
+
+    // $ANTLR start "T__161"
+    public final void mT__161() throws RecognitionException {
+        try {
+            int _type = T__161;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:159:8: ( 'deviceBrightness' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:159:10: 'deviceBrightness'
+            {
+            match("deviceBrightness"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__161"
+
+    // $ANTLR start "T__162"
+    public final void mT__162() throws RecognitionException {
+        try {
+            int _type = T__162;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:160:8: ( 'displayBitmap' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:160:10: 'displayBitmap'
+            {
+            match("displayBitmap"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__162"
+
+    // $ANTLR start "T__163"
+    public final void mT__163() throws RecognitionException {
+        try {
+            int _type = T__163;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:161:8: ( 'id' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:161:10: 'id'
+            {
+            match("id"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__163"
+
+    // $ANTLR start "T__164"
+    public final void mT__164() throws RecognitionException {
+        try {
+            int _type = T__164;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:162:8: ( 'displayText' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:162:10: 'displayText'
+            {
+            match("displayText"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__164"
+
+    // $ANTLR start "T__165"
+    public final void mT__165() throws RecognitionException {
+        try {
+            int _type = T__165;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:163:8: ( 'text' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:163:10: 'text'
+            {
+            match("text"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__165"
+
+    // $ANTLR start "T__166"
+    public final void mT__166() throws RecognitionException {
+        try {
+            int _type = T__166;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:164:8: ( 'displayTextAt' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:164:10: 'displayTextAt'
+            {
+            match("displayTextAt"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__166"
+
+    // $ANTLR start "T__167"
+    public final void mT__167() throws RecognitionException {
+        try {
+            int _type = T__167;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:165:8: ( 'interCharacterWait' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:165:10: 'interCharacterWait'
+            {
+            match("interCharacterWait"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__167"
+
+    // $ANTLR start "T__168"
+    public final void mT__168() throws RecognitionException {
+        try {
+            int _type = T__168;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:166:8: ( 'marqueeFormat' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:166:10: 'marqueeFormat'
+            {
+            match("marqueeFormat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__168"
+
+    // $ANTLR start "T__169"
+    public final void mT__169() throws RecognitionException {
+        try {
+            int _type = T__169;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:167:8: ( 'marqueeRepeatWait' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:167:10: 'marqueeRepeatWait'
+            {
+            match("marqueeRepeatWait"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__169"
+
+    // $ANTLR start "T__170"
+    public final void mT__170() throws RecognitionException {
+        try {
+            int _type = T__170;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:168:8: ( 'marqueeType' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:168:10: 'marqueeType'
+            {
+            match("marqueeType"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__170"
+
+    // $ANTLR start "T__171"
+    public final void mT__171() throws RecognitionException {
+        try {
+            int _type = T__171;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:169:8: ( 'marqueeUnitWait' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:169:10: 'marqueeUnitWait'
+            {
+            match("marqueeUnitWait"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__171"
+
+    // $ANTLR start "T__172"
+    public final void mT__172() throws RecognitionException {
+        try {
+            int _type = T__172;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:170:8: ( 'scroll' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:170:10: 'scroll'
+            {
+            match("scroll"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__172"
+
+    // $ANTLR start "T__173"
+    public final void mT__173() throws RecognitionException {
+        try {
+            int _type = T__173;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:171:8: ( 'openDrawer' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:171:10: 'openDrawer'
+            {
+            match("openDrawer"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__173"
+
+    // $ANTLR start "T__174"
+    public final void mT__174() throws RecognitionException {
+        try {
+            int _type = T__174;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:172:8: ( 'printBarcode' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:172:10: 'printBarcode'
+            {
+            match("printBarcode"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__174"
+
+    // $ANTLR start "T__175"
+    public final void mT__175() throws RecognitionException {
+        try {
+            int _type = T__175;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:173:8: ( 'data' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:173:10: 'data'
+            {
+            match("data"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__175"
+
+    // $ANTLR start "T__176"
+    public final void mT__176() throws RecognitionException {
+        try {
+            int _type = T__176;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:174:8: ( 'barcodeType' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:174:10: 'barcodeType'
+            {
+            match("barcodeType"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__176"
+
+    // $ANTLR start "T__177"
+    public final void mT__177() throws RecognitionException {
+        try {
+            int _type = T__177;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:175:8: ( 'printBitmap' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:175:10: 'printBitmap'
+            {
+            match("printBitmap"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__177"
+
+    // $ANTLR start "T__178"
+    public final void mT__178() throws RecognitionException {
+        try {
+            int _type = T__178;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:176:8: ( 'printCut' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:176:10: 'printCut'
+            {
+            match("printCut"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__178"
+
+    // $ANTLR start "T__179"
+    public final void mT__179() throws RecognitionException {
+        try {
+            int _type = T__179;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:177:8: ( 'printNormal' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:177:10: 'printNormal'
+            {
+            match("printNormal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__179"
+
+    // $ANTLR start "T__180"
+    public final void mT__180() throws RecognitionException {
+        try {
+            int _type = T__180;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:178:8: ( 'registerBitmap' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:178:10: 'registerBitmap'
+            {
+            match("registerBitmap"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__180"
+
+    // $ANTLR start "T__181"
+    public final void mT__181() throws RecognitionException {
+        try {
+            int _type = T__181;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:179:8: ( 'name' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:179:10: 'name'
+            {
+            match("name"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__181"
+
+    // $ANTLR start "T__182"
+    public final void mT__182() throws RecognitionException {
+        try {
+            int _type = T__182;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:180:8: ( 'paymentOpen' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:180:10: 'paymentOpen'
+            {
+            match("paymentOpen"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__182"
+
+    // $ANTLR start "T__183"
+    public final void mT__183() throws RecognitionException {
+        try {
+            int _type = T__183;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:181:8: ( 'host' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:181:10: 'host'
+            {
+            match("host"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__183"
+
+    // $ANTLR start "T__184"
+    public final void mT__184() throws RecognitionException {
+        try {
+            int _type = T__184;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:182:8: ( 'port' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:182:10: 'port'
+            {
+            match("port"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__184"
+
+    // $ANTLR start "T__185"
+    public final void mT__185() throws RecognitionException {
+        try {
+            int _type = T__185;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:183:8: ( 'paymentClose' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:183:10: 'paymentClose'
+            {
+            match("paymentClose"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__185"
+
+    // $ANTLR start "T__186"
+    public final void mT__186() throws RecognitionException {
+        try {
+            int _type = T__186;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:184:8: ( 'paymentAcknowledge' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:184:10: 'paymentAcknowledge'
+            {
+            match("paymentAcknowledge"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__186"
+
+    // $ANTLR start "T__187"
+    public final void mT__187() throws RecognitionException {
+        try {
+            int _type = T__187;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:185:8: ( 'paymentReversal' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:185:10: 'paymentReversal'
+            {
+            match("paymentReversal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__187"
+
+    // $ANTLR start "T__188"
+    public final void mT__188() throws RecognitionException {
+        try {
+            int _type = T__188;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:186:8: ( 'withPassword' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:186:10: 'withPassword'
+            {
+            match("withPassword"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__188"
+
+    // $ANTLR start "T__189"
+    public final void mT__189() throws RecognitionException {
+        try {
+            int _type = T__189;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:187:8: ( 'ofReceipt' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:187:10: 'ofReceipt'
+            {
+            match("ofReceipt"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__189"
+
+    // $ANTLR start "T__190"
+    public final void mT__190() throws RecognitionException {
+        try {
+            int _type = T__190;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:188:8: ( 'paymentRegistration' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:188:10: 'paymentRegistration'
+            {
+            match("paymentRegistration"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__190"
+
+    // $ANTLR start "T__191"
+    public final void mT__191() throws RecognitionException {
+        try {
+            int _type = T__191;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:189:8: ( 'configuration' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:189:10: 'configuration'
+            {
+            match("configuration"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__191"
+
+    // $ANTLR start "T__192"
+    public final void mT__192() throws RecognitionException {
+        try {
+            int _type = T__192;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:190:8: ( 'paymentAuthorization' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:190:10: 'paymentAuthorization'
+            {
+            match("paymentAuthorization"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__192"
+
+    // $ANTLR start "T__193"
+    public final void mT__193() throws RecognitionException {
+        try {
+            int _type = T__193;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:191:8: ( 'ofAmount' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:191:10: 'ofAmount'
+            {
+            match("ofAmount"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__193"
+
+    // $ANTLR start "T__194"
+    public final void mT__194() throws RecognitionException {
+        try {
+            int _type = T__194;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:192:8: ( 'paymentResponse' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:192:10: 'paymentResponse'
+            {
+            match("paymentResponse"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__194"
+
+    // $ANTLR start "T__195"
+    public final void mT__195() throws RecognitionException {
+        try {
+            int _type = T__195;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:193:8: ( 'from' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:193:10: 'from'
+            {
+            match("from"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__195"
+
+    // $ANTLR start "T__196"
+    public final void mT__196() throws RecognitionException {
+        try {
+            int _type = T__196;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:194:8: ( 'printReport' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:194:10: 'printReport'
+            {
+            match("printReport"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__196"
+
+    // $ANTLR start "T__197"
+    public final void mT__197() throws RecognitionException {
+        try {
+            int _type = T__197;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:195:8: ( 'operation' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:195:10: 'operation'
+            {
+            match("operation"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__197"
+
+    // $ANTLR start "T__198"
+    public final void mT__198() throws RecognitionException {
+        try {
+            int _type = T__198;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:196:8: ( '(' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:196:10: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__198"
+
+    // $ANTLR start "T__199"
+    public final void mT__199() throws RecognitionException {
+        try {
+            int _type = T__199;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:197:8: ( ')' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:197:10: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__199"
+
+    // $ANTLR start "T__200"
+    public final void mT__200() throws RecognitionException {
+        try {
+            int _type = T__200;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:198:8: ( 'guard' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:198:10: 'guard'
+            {
+            match("guard"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__200"
+
+    // $ANTLR start "T__201"
+    public final void mT__201() throws RecognitionException {
+        try {
+            int _type = T__201;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:199:8: ( 'caption' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:199:10: 'caption'
+            {
+            match("caption"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__201"
+
+    // $ANTLR start "T__202"
+    public final void mT__202() throws RecognitionException {
+        try {
+            int _type = T__202;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:200:8: ( 'description' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:200:10: 'description'
+            {
+            match("description"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__202"
+
+    // $ANTLR start "T__203"
+    public final void mT__203() throws RecognitionException {
+        try {
+            int _type = T__203;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:201:8: ( 'type' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:201:10: 'type'
+            {
+            match("type"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__203"
+
+    // $ANTLR start "T__204"
+    public final void mT__204() throws RecognitionException {
+        try {
+            int _type = T__204;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:202:8: ( 'function' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:202:10: 'function'
+            {
+            match("function"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__204"
+
+    // $ANTLR start "T__205"
+    public final void mT__205() throws RecognitionException {
+        try {
+            int _type = T__205;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:203:8: ( 'store' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:203:10: 'store'
+            {
+            match("store"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__205"
+
+    // $ANTLR start "T__206"
+    public final void mT__206() throws RecognitionException {
+        try {
+            int _type = T__206;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:204:8: ( 'with' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:204:10: 'with'
+            {
+            match("with"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__206"
+
+    // $ANTLR start "T__207"
+    public final void mT__207() throws RecognitionException {
+        try {
+            int _type = T__207;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:205:8: ( 'retrieve' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:205:10: 'retrieve'
+            {
+            match("retrieve"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__207"
+
+    // $ANTLR start "T__208"
+    public final void mT__208() throws RecognitionException {
+        try {
+            int _type = T__208;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:206:8: ( 'transition' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:206:10: 'transition'
+            {
+            match("transition"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__208"
+
+    // $ANTLR start "T__209"
+    public final void mT__209() throws RecognitionException {
+        try {
+            int _type = T__209;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:207:8: ( 'translate' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:207:10: 'translate'
+            {
+            match("translate"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__209"
+
+    // $ANTLR start "T__210"
+    public final void mT__210() throws RecognitionException {
+        try {
+            int _type = T__210;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:208:8: ( 'dto' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:208:10: 'dto'
+            {
+            match("dto"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__210"
+
+    // $ANTLR start "T__211"
+    public final void mT__211() throws RecognitionException {
+        try {
+            int _type = T__211;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:209:8: ( 'get' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:209:10: 'get'
+            {
+            match("get"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__211"
+
+    // $ANTLR start "T__212"
+    public final void mT__212() throws RecognitionException {
+        try {
+            int _type = T__212;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:210:8: ( ',' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:210:10: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__212"
+
+    // $ANTLR start "T__213"
+    public final void mT__213() throws RecognitionException {
+        try {
+            int _type = T__213;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:211:8: ( 'set' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:211:10: 'set'
+            {
+            match("set"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__213"
+
+    // $ANTLR start "T__214"
+    public final void mT__214() throws RecognitionException {
+        try {
+            int _type = T__214;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:212:8: ( 'clear' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:212:10: 'clear'
+            {
+            match("clear"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__214"
+
+    // $ANTLR start "T__215"
+    public final void mT__215() throws RecognitionException {
+        try {
+            int _type = T__215;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:213:8: ( 'remove' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:213:10: 'remove'
+            {
+            match("remove"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__215"
+
+    // $ANTLR start "T__216"
+    public final void mT__216() throws RecognitionException {
+        try {
+            int _type = T__216;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:214:8: ( 'visible' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:214:10: 'visible'
+            {
+            match("visible"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__216"
+
+    // $ANTLR start "T__217"
+    public final void mT__217() throws RecognitionException {
+        try {
+            int _type = T__217;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:215:8: ( 'invisible' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:215:10: 'invisible'
+            {
+            match("invisible"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__217"
+
+    // $ANTLR start "T__218"
+    public final void mT__218() throws RecognitionException {
+        try {
+            int _type = T__218;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:216:8: ( 'image' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:216:10: 'image'
+            {
+            match("image"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__218"
+
+    // $ANTLR start "T__219"
+    public final void mT__219() throws RecognitionException {
+        try {
+            int _type = T__219;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:217:8: ( 'search' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:217:10: 'search'
+            {
+            match("search"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__219"
+
+    // $ANTLR start "T__220"
+    public final void mT__220() throws RecognitionException {
+        try {
+            int _type = T__220;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:218:8: ( 'in' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:218:10: 'in'
+            {
+            match("in"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__220"
+
+    // $ANTLR start "T__221"
+    public final void mT__221() throws RecognitionException {
+        try {
+            int _type = T__221;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:219:8: ( 'schedule' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:219:10: 'schedule'
+            {
+            match("schedule"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__221"
+
+    // $ANTLR start "T__222"
+    public final void mT__222() throws RecognitionException {
+        try {
+            int _type = T__222;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:220:8: ( 'keypad' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:220:10: 'keypad'
+            {
+            match("keypad"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__222"
+
+    // $ANTLR start "T__223"
+    public final void mT__223() throws RecognitionException {
+        try {
+            int _type = T__223;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:221:8: ( 'fields' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:221:10: 'fields'
+            {
+            match("fields"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__223"
+
+    // $ANTLR start "T__224"
+    public final void mT__224() throws RecognitionException {
+        try {
+            int _type = T__224;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:222:8: ( 'dataProvider' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:222:10: 'dataProvider'
+            {
+            match("dataProvider"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__224"
+
+    // $ANTLR start "T__225"
+    public final void mT__225() throws RecognitionException {
+        try {
+            int _type = T__225;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:223:8: ( 'scheduler' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:223:10: 'scheduler'
+            {
+            match("scheduler"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__225"
+
+    // $ANTLR start "T__226"
+    public final void mT__226() throws RecognitionException {
+        try {
+            int _type = T__226;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:224:8: ( 'lineDisplay' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:224:10: 'lineDisplay'
+            {
+            match("lineDisplay"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__226"
+
+    // $ANTLR start "T__227"
+    public final void mT__227() throws RecognitionException {
+        try {
+            int _type = T__227;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:225:8: ( 'posPrinter' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:225:10: 'posPrinter'
+            {
+            match("posPrinter"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__227"
+
+    // $ANTLR start "T__228"
+    public final void mT__228() throws RecognitionException {
+        try {
+            int _type = T__228;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:226:8: ( 'cashDrawer' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:226:10: 'cashDrawer'
+            {
+            match("cashDrawer"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__228"
+
+    // $ANTLR start "T__229"
+    public final void mT__229() throws RecognitionException {
+        try {
+            int _type = T__229;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:227:8: ( 'payment' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:227:10: 'payment'
+            {
+            match("payment"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__229"
+
+    // $ANTLR start "T__230"
+    public final void mT__230() throws RecognitionException {
+        try {
+            int _type = T__230;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:228:8: ( 'peripheral' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:228:10: 'peripheral'
+            {
+            match("peripheral"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__230"
+
+    // $ANTLR start "T__231"
+    public final void mT__231() throws RecognitionException {
+        try {
+            int _type = T__231;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:229:8: ( 'button' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:229:10: 'button'
+            {
+            match("button"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__231"
+
+    // $ANTLR start "T__232"
+    public final void mT__232() throws RecognitionException {
+        try {
+            int _type = T__232;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:230:8: ( 'key' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:230:10: 'key'
+            {
+            match("key"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__232"
+
+    // $ANTLR start "T__233"
+    public final void mT__233() throws RecognitionException {
+        try {
+            int _type = T__233;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:231:8: ( 'field' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:231:10: 'field'
+            {
+            match("field"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__233"
+
+    // $ANTLR start "T__234"
+    public final void mT__234() throws RecognitionException {
+        try {
+            int _type = T__234;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:232:8: ( 'layout' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:232:10: 'layout'
+            {
+            match("layout"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__234"
+
+    // $ANTLR start "T__235"
+    public final void mT__235() throws RecognitionException {
+        try {
+            int _type = T__235;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:233:8: ( 'delay' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:233:10: 'delay'
+            {
+            match("delay"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__235"
+
+    // $ANTLR start "T__236"
+    public final void mT__236() throws RecognitionException {
+        try {
+            int _type = T__236;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:234:8: ( 'send' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:234:10: 'send'
+            {
+            match("send"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__236"
+
+    // $ANTLR start "T__237"
+    public final void mT__237() throws RecognitionException {
+        try {
+            int _type = T__237;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:235:8: ( ']' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:235:10: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__237"
+
+    // $ANTLR start "T__238"
+    public final void mT__238() throws RecognitionException {
+        try {
+            int _type = T__238;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:236:8: ( '#' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:236:10: '#'
+            {
+            match('#'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__238"
+
+    // $ANTLR start "T__239"
+    public final void mT__239() throws RecognitionException {
+        try {
+            int _type = T__239;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:237:8: ( '[' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:237:10: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__239"
+
+    // $ANTLR start "T__240"
+    public final void mT__240() throws RecognitionException {
+        try {
+            int _type = T__240;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:238:8: ( 'instanceof' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:238:10: 'instanceof'
+            {
+            match("instanceof"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__240"
+
+    // $ANTLR start "T__241"
+    public final void mT__241() throws RecognitionException {
+        try {
+            int _type = T__241;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:239:8: ( 'as' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:239:10: 'as'
+            {
+            match("as"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__241"
+
+    // $ANTLR start "T__242"
+    public final void mT__242() throws RecognitionException {
+        try {
+            int _type = T__242;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:240:8: ( ';' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:240:10: ';'
+            {
+            match(';'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__242"
+
+    // $ANTLR start "T__243"
+    public final void mT__243() throws RecognitionException {
+        try {
+            int _type = T__243;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:241:8: ( 'if' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:241:10: 'if'
+            {
+            match("if"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__243"
+
+    // $ANTLR start "T__244"
+    public final void mT__244() throws RecognitionException {
+        try {
+            int _type = T__244;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:242:8: ( 'else' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:242:10: 'else'
+            {
+            match("else"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__244"
+
+    // $ANTLR start "T__245"
+    public final void mT__245() throws RecognitionException {
+        try {
+            int _type = T__245;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:243:8: ( 'switch' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:243:10: 'switch'
+            {
+            match("switch"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__245"
+
+    // $ANTLR start "T__246"
+    public final void mT__246() throws RecognitionException {
+        try {
+            int _type = T__246;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:244:8: ( ':' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:244:10: ':'
+            {
+            match(':'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__246"
+
+    // $ANTLR start "T__247"
+    public final void mT__247() throws RecognitionException {
+        try {
+            int _type = T__247;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:245:8: ( 'default' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:245:10: 'default'
+            {
+            match("default"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__247"
+
+    // $ANTLR start "T__248"
+    public final void mT__248() throws RecognitionException {
+        try {
+            int _type = T__248;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:246:8: ( 'case' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:246:10: 'case'
+            {
+            match("case"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__248"
+
+    // $ANTLR start "T__249"
+    public final void mT__249() throws RecognitionException {
+        try {
+            int _type = T__249;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:247:8: ( 'for' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:247:10: 'for'
+            {
+            match("for"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__249"
+
+    // $ANTLR start "T__250"
+    public final void mT__250() throws RecognitionException {
+        try {
+            int _type = T__250;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:248:8: ( 'while' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:248:10: 'while'
+            {
+            match("while"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__250"
+
+    // $ANTLR start "T__251"
+    public final void mT__251() throws RecognitionException {
+        try {
+            int _type = T__251;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:249:8: ( 'do' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:249:10: 'do'
+            {
+            match("do"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__251"
+
+    // $ANTLR start "T__252"
+    public final void mT__252() throws RecognitionException {
+        try {
+            int _type = T__252;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:250:8: ( 'new' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:250:10: 'new'
+            {
+            match("new"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__252"
+
+    // $ANTLR start "T__253"
+    public final void mT__253() throws RecognitionException {
+        try {
+            int _type = T__253;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:251:8: ( 'null' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:251:10: 'null'
+            {
+            match("null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__253"
+
+    // $ANTLR start "T__254"
+    public final void mT__254() throws RecognitionException {
+        try {
+            int _type = T__254;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:252:8: ( 'typeof' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:252:10: 'typeof'
+            {
+            match("typeof"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__254"
+
+    // $ANTLR start "T__255"
+    public final void mT__255() throws RecognitionException {
+        try {
+            int _type = T__255;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:253:8: ( 'throw' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:253:10: 'throw'
+            {
+            match("throw"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__255"
+
+    // $ANTLR start "T__256"
+    public final void mT__256() throws RecognitionException {
+        try {
+            int _type = T__256;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:254:8: ( 'return' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:254:10: 'return'
+            {
+            match("return"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__256"
+
+    // $ANTLR start "T__257"
+    public final void mT__257() throws RecognitionException {
+        try {
+            int _type = T__257;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:255:8: ( 'try' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:255:10: 'try'
+            {
+            match("try"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__257"
+
+    // $ANTLR start "T__258"
+    public final void mT__258() throws RecognitionException {
+        try {
+            int _type = T__258;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:256:8: ( 'finally' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:256:10: 'finally'
+            {
+            match("finally"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__258"
+
+    // $ANTLR start "T__259"
+    public final void mT__259() throws RecognitionException {
+        try {
+            int _type = T__259;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:257:8: ( 'synchronized' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:257:10: 'synchronized'
+            {
+            match("synchronized"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__259"
+
+    // $ANTLR start "T__260"
+    public final void mT__260() throws RecognitionException {
+        try {
+            int _type = T__260;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:258:8: ( 'catch' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:258:10: 'catch'
+            {
+            match("catch"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__260"
+
+    // $ANTLR start "T__261"
+    public final void mT__261() throws RecognitionException {
+        try {
+            int _type = T__261;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:259:8: ( '?' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:259:10: '?'
+            {
+            match('?'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__261"
+
+    // $ANTLR start "T__262"
+    public final void mT__262() throws RecognitionException {
+        try {
+            int _type = T__262;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:260:8: ( '&' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:260:10: '&'
+            {
+            match('&'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__262"
+
+    // $ANTLR start "T__263"
+    public final void mT__263() throws RecognitionException {
+        try {
+            int _type = T__263;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:261:8: ( 'described by' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:261:10: 'described by'
+            {
+            match("described by"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__263"
+
+    // $ANTLR start "T__264"
+    public final void mT__264() throws RecognitionException {
+        try {
+            int _type = T__264;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:262:8: ( 'and' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:262:10: 'and'
+            {
+            match("and"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__264"
+
+    // $ANTLR start "T__265"
+    public final void mT__265() throws RecognitionException {
+        try {
+            int _type = T__265;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:263:8: ( 'onFail' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:263:10: 'onFail'
+            {
+            match("onFail"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__265"
+
+    // $ANTLR start "T__266"
+    public final void mT__266() throws RecognitionException {
+        try {
+            int _type = T__266;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:264:8: ( '::' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:264:10: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__266"
+
+    // $ANTLR start "T__267"
+    public final void mT__267() throws RecognitionException {
+        try {
+            int _type = T__267;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:265:8: ( '?.' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:265:10: '?.'
+            {
+            match("?."); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__267"
+
+    // $ANTLR start "T__268"
+    public final void mT__268() throws RecognitionException {
+        try {
+            int _type = T__268;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:266:8: ( '|' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:266:10: '|'
+            {
+            match('|'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__268"
+
+    // $ANTLR start "T__269"
+    public final void mT__269() throws RecognitionException {
+        try {
+            int _type = T__269;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:267:8: ( 'var' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:267:10: 'var'
+            {
+            match("var"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__269"
+
+    // $ANTLR start "T__270"
+    public final void mT__270() throws RecognitionException {
+        try {
+            int _type = T__270;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:268:8: ( 'true' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:268:10: 'true'
+            {
+            match("true"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__270"
+
+    // $ANTLR start "RULE_HEX"
+    public final void mRULE_HEX() throws RecognitionException {
+        try {
+            int _type = RULE_HEX;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            {
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:12: ( '0x' | '0X' )
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0=='0') ) {
+                int LA1_1 = input.LA(2);
+
+                if ( (LA1_1=='x') ) {
+                    alt1=1;
+                }
+                else if ( (LA1_1=='X') ) {
+                    alt1=2;
+                }
+                else {
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 1, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 1, 0, input);
+
+                throw nvae;
+            }
+            switch (alt1) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:13: '0x'
+                    {
+                    match("0x"); 
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:18: '0X'
+                    {
+                    match("0X"); 
+
+
+                    }
+                    break;
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            int cnt2=0;
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( ((LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='F')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='f')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='f') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt2 >= 1 ) break loop2;
+                        EarlyExitException eee =
+                            new EarlyExitException(2, input);
+                        throw eee;
+                }
+                cnt2++;
+            } while (true);
+
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0=='#') ) {
+                alt4=1;
+            }
+            switch (alt4) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    {
+                    match('#'); 
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    int alt3=2;
+                    int LA3_0 = input.LA(1);
+
+                    if ( (LA3_0=='B'||LA3_0=='b') ) {
+                        alt3=1;
+                    }
+                    else if ( (LA3_0=='L'||LA3_0=='l') ) {
+                        alt3=2;
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 3, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt3) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            {
+                            if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+                            if ( input.LA(1)=='I'||input.LA(1)=='i' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+                        case 2 :
+                            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41898:84: ( 'l' | 'L' )
+                            {
+                            if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_HEX"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41900:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41900:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            {
+            matchRange('0','9'); 
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41900:21: ( '0' .. '9' | '_' )*
+            loop5:
+            do {
+                int alt5=2;
+                int LA5_0 = input.LA(1);
+
+                if ( ((LA5_0>='0' && LA5_0<='9')||LA5_0=='_') ) {
+                    alt5=1;
+                }
+
+
+                switch (alt5) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)=='_' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop5;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_DECIMAL"
+    public final void mRULE_DECIMAL() throws RecognitionException {
+        try {
+            int _type = RULE_DECIMAL;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41902:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41902:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            {
+            mRULE_INT(); 
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41902:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0=='E'||LA7_0=='e') ) {
+                alt7=1;
+            }
+            switch (alt7) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41902:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    {
+                    if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41902:36: ( '+' | '-' )?
+                    int alt6=2;
+                    int LA6_0 = input.LA(1);
+
+                    if ( (LA6_0=='+'||LA6_0=='-') ) {
+                        alt6=1;
+                    }
+                    switch (alt6) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:
+                            {
+                            if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+
+                    }
+
+                    mRULE_INT(); 
+
+                    }
+                    break;
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41902:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            int alt8=3;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0=='B'||LA8_0=='b') ) {
+                alt8=1;
+            }
+            else if ( (LA8_0=='D'||LA8_0=='F'||LA8_0=='L'||LA8_0=='d'||LA8_0=='f'||LA8_0=='l') ) {
+                alt8=2;
+            }
+            switch (alt8) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41902:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    {
+                    if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+                    if ( input.LA(1)=='D'||input.LA(1)=='I'||input.LA(1)=='d'||input.LA(1)=='i' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41902:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    {
+                    if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_DECIMAL"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41904:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41904:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            {
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41904:11: ( '^' )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0=='^') ) {
+                alt9=1;
+            }
+            switch (alt9) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41904: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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41904:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            loop10:
+            do {
+                int alt10=2;
+                int LA10_0 = input.LA(1);
+
+                if ( (LA10_0=='$'||(LA10_0>='0' && LA10_0<='9')||(LA10_0>='A' && LA10_0<='Z')||LA10_0=='_'||(LA10_0>='a' && LA10_0<='z')) ) {
+                    alt10=1;
+                }
+
+
+                switch (alt10) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:
+            	    {
+            	    if ( input.LA(1)=='$'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop10;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0=='\"') ) {
+                alt15=1;
+            }
+            else if ( (LA15_0=='\'') ) {
+                alt15=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 15, 0, input);
+
+                throw nvae;
+            }
+            switch (alt15) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    {
+                    match('\"'); 
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop11:
+                    do {
+                        int alt11=3;
+                        int LA11_0 = input.LA(1);
+
+                        if ( (LA11_0=='\\') ) {
+                            alt11=1;
+                        }
+                        else if ( ((LA11_0>='\u0000' && LA11_0<='!')||(LA11_0>='#' && LA11_0<='[')||(LA11_0>=']' && LA11_0<='\uFFFF')) ) {
+                            alt11=2;
+                        }
+
+
+                        switch (alt11) {
+                    	case 1 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop11;
+                        }
+                    } while (true);
+
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:44: ( '\"' )?
+                    int alt12=2;
+                    int LA12_0 = input.LA(1);
+
+                    if ( (LA12_0=='\"') ) {
+                        alt12=1;
+                    }
+                    switch (alt12) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:44: '\"'
+                            {
+                            match('\"'); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    {
+                    match('\''); 
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop13:
+                    do {
+                        int alt13=3;
+                        int LA13_0 = input.LA(1);
+
+                        if ( (LA13_0=='\\') ) {
+                            alt13=1;
+                        }
+                        else if ( ((LA13_0>='\u0000' && LA13_0<='&')||(LA13_0>='(' && LA13_0<='[')||(LA13_0>=']' && LA13_0<='\uFFFF')) ) {
+                            alt13=2;
+                        }
+
+
+                        switch (alt13) {
+                    	case 1 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:55: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop13;
+                        }
+                    } while (true);
+
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906:79: ( '\\'' )?
+                    int alt14=2;
+                    int LA14_0 = input.LA(1);
+
+                    if ( (LA14_0=='\'') ) {
+                        alt14=1;
+                    }
+                    switch (alt14) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41906: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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41908:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41908:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41908:24: ( options {greedy=false; } : . )*
+            loop16:
+            do {
+                int alt16=2;
+                int LA16_0 = input.LA(1);
+
+                if ( (LA16_0=='*') ) {
+                    int LA16_1 = input.LA(2);
+
+                    if ( (LA16_1=='/') ) {
+                        alt16=2;
+                    }
+                    else if ( ((LA16_1>='\u0000' && LA16_1<='.')||(LA16_1>='0' && LA16_1<='\uFFFF')) ) {
+                        alt16=1;
+                    }
+
+
+                }
+                else if ( ((LA16_0>='\u0000' && LA16_0<=')')||(LA16_0>='+' && LA16_0<='\uFFFF')) ) {
+                    alt16=1;
+                }
+
+
+                switch (alt16) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41908:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop16;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41910:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41910:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41910:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop17:
+            do {
+                int alt17=2;
+                int LA17_0 = input.LA(1);
+
+                if ( ((LA17_0>='\u0000' && LA17_0<='\t')||(LA17_0>='\u000B' && LA17_0<='\f')||(LA17_0>='\u000E' && LA17_0<='\uFFFF')) ) {
+                    alt17=1;
+                }
+
+
+                switch (alt17) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41910:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop17;
+                }
+            } while (true);
+
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41910:40: ( ( '\\r' )? '\\n' )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0=='\n'||LA19_0=='\r') ) {
+                alt19=1;
+            }
+            switch (alt19) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41910:41: ( '\\r' )? '\\n'
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41910:41: ( '\\r' )?
+                    int alt18=2;
+                    int LA18_0 = input.LA(1);
+
+                    if ( (LA18_0=='\r') ) {
+                        alt18=1;
+                    }
+                    switch (alt18) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41910: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.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41912:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41912:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41912:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt20=0;
+            loop20:
+            do {
+                int alt20=2;
+                int LA20_0 = input.LA(1);
+
+                if ( ((LA20_0>='\t' && LA20_0<='\n')||LA20_0=='\r'||LA20_0==' ') ) {
+                    alt20=1;
+                }
+
+
+                switch (alt20) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt20 >= 1 ) break loop20;
+                        EarlyExitException eee =
+                            new EarlyExitException(20, input);
+                        throw eee;
+                }
+                cnt20++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41914:16: ( . )
+            // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:41914:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | T__237 | T__238 | T__239 | T__240 | T__241 | T__242 | T__243 | T__244 | T__245 | T__246 | T__247 | T__248 | T__249 | T__250 | T__251 | T__252 | T__253 | T__254 | T__255 | T__256 | T__257 | T__258 | T__259 | T__260 | T__261 | T__262 | T__263 | T__264 | T__265 | T__266 | T__267 | T__268 | T__269 | T__270 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt21=267;
+        alt21 = dfa21.predict(input);
+        switch (alt21) {
+            case 1 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:10: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 2 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:16: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 3 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:22: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 4 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:28: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 5 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:34: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 6 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:40: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 7 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:46: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 8 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:52: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 9 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:58: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 10 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:64: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 11 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:70: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 12 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:76: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 13 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:82: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 14 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:88: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 15 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:94: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 16 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:100: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 17 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:106: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 18 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:112: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 19 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:118: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 20 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:124: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 21 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:130: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 22 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:136: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 23 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:142: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 24 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:148: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 25 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:154: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 26 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:160: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 27 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:166: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 28 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:172: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 29 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:178: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 30 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:184: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 31 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:190: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 32 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:196: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 33 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:202: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 34 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:208: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 35 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:214: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 36 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:220: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 37 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:226: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 38 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:232: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 39 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:238: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 40 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:244: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 41 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:250: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 42 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:256: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 43 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:262: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 44 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:268: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 45 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:274: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 46 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:280: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 47 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:286: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 48 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:292: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 49 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:298: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 50 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:304: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 51 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:310: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 52 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:316: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 53 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:322: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 54 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:328: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 55 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:334: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 56 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:340: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 57 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:346: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 58 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:352: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 59 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:358: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 60 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:364: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 61 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:370: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 62 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:376: T__74
+                {
+                mT__74(); 
+
+                }
+                break;
+            case 63 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:382: T__75
+                {
+                mT__75(); 
+
+                }
+                break;
+            case 64 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:388: T__76
+                {
+                mT__76(); 
+
+                }
+                break;
+            case 65 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:394: T__77
+                {
+                mT__77(); 
+
+                }
+                break;
+            case 66 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:400: T__78
+                {
+                mT__78(); 
+
+                }
+                break;
+            case 67 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:406: T__79
+                {
+                mT__79(); 
+
+                }
+                break;
+            case 68 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:412: T__80
+                {
+                mT__80(); 
+
+                }
+                break;
+            case 69 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:418: T__81
+                {
+                mT__81(); 
+
+                }
+                break;
+            case 70 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:424: T__82
+                {
+                mT__82(); 
+
+                }
+                break;
+            case 71 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:430: T__83
+                {
+                mT__83(); 
+
+                }
+                break;
+            case 72 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:436: T__84
+                {
+                mT__84(); 
+
+                }
+                break;
+            case 73 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:442: T__85
+                {
+                mT__85(); 
+
+                }
+                break;
+            case 74 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:448: T__86
+                {
+                mT__86(); 
+
+                }
+                break;
+            case 75 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:454: T__87
+                {
+                mT__87(); 
+
+                }
+                break;
+            case 76 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:460: T__88
+                {
+                mT__88(); 
+
+                }
+                break;
+            case 77 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:466: T__89
+                {
+                mT__89(); 
+
+                }
+                break;
+            case 78 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:472: T__90
+                {
+                mT__90(); 
+
+                }
+                break;
+            case 79 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:478: T__91
+                {
+                mT__91(); 
+
+                }
+                break;
+            case 80 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:484: T__92
+                {
+                mT__92(); 
+
+                }
+                break;
+            case 81 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:490: T__93
+                {
+                mT__93(); 
+
+                }
+                break;
+            case 82 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:496: T__94
+                {
+                mT__94(); 
+
+                }
+                break;
+            case 83 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:502: T__95
+                {
+                mT__95(); 
+
+                }
+                break;
+            case 84 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:508: T__96
+                {
+                mT__96(); 
+
+                }
+                break;
+            case 85 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:514: T__97
+                {
+                mT__97(); 
+
+                }
+                break;
+            case 86 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:520: T__98
+                {
+                mT__98(); 
+
+                }
+                break;
+            case 87 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:526: T__99
+                {
+                mT__99(); 
+
+                }
+                break;
+            case 88 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:532: T__100
+                {
+                mT__100(); 
+
+                }
+                break;
+            case 89 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:539: T__101
+                {
+                mT__101(); 
+
+                }
+                break;
+            case 90 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:546: T__102
+                {
+                mT__102(); 
+
+                }
+                break;
+            case 91 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:553: T__103
+                {
+                mT__103(); 
+
+                }
+                break;
+            case 92 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:560: T__104
+                {
+                mT__104(); 
+
+                }
+                break;
+            case 93 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:567: T__105
+                {
+                mT__105(); 
+
+                }
+                break;
+            case 94 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:574: T__106
+                {
+                mT__106(); 
+
+                }
+                break;
+            case 95 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:581: T__107
+                {
+                mT__107(); 
+
+                }
+                break;
+            case 96 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:588: T__108
+                {
+                mT__108(); 
+
+                }
+                break;
+            case 97 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:595: T__109
+                {
+                mT__109(); 
+
+                }
+                break;
+            case 98 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:602: T__110
+                {
+                mT__110(); 
+
+                }
+                break;
+            case 99 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:609: T__111
+                {
+                mT__111(); 
+
+                }
+                break;
+            case 100 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:616: T__112
+                {
+                mT__112(); 
+
+                }
+                break;
+            case 101 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:623: T__113
+                {
+                mT__113(); 
+
+                }
+                break;
+            case 102 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:630: T__114
+                {
+                mT__114(); 
+
+                }
+                break;
+            case 103 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:637: T__115
+                {
+                mT__115(); 
+
+                }
+                break;
+            case 104 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:644: T__116
+                {
+                mT__116(); 
+
+                }
+                break;
+            case 105 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:651: T__117
+                {
+                mT__117(); 
+
+                }
+                break;
+            case 106 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:658: T__118
+                {
+                mT__118(); 
+
+                }
+                break;
+            case 107 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:665: T__119
+                {
+                mT__119(); 
+
+                }
+                break;
+            case 108 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:672: T__120
+                {
+                mT__120(); 
+
+                }
+                break;
+            case 109 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:679: T__121
+                {
+                mT__121(); 
+
+                }
+                break;
+            case 110 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:686: T__122
+                {
+                mT__122(); 
+
+                }
+                break;
+            case 111 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:693: T__123
+                {
+                mT__123(); 
+
+                }
+                break;
+            case 112 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:700: T__124
+                {
+                mT__124(); 
+
+                }
+                break;
+            case 113 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:707: T__125
+                {
+                mT__125(); 
+
+                }
+                break;
+            case 114 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:714: T__126
+                {
+                mT__126(); 
+
+                }
+                break;
+            case 115 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:721: T__127
+                {
+                mT__127(); 
+
+                }
+                break;
+            case 116 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:728: T__128
+                {
+                mT__128(); 
+
+                }
+                break;
+            case 117 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:735: T__129
+                {
+                mT__129(); 
+
+                }
+                break;
+            case 118 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:742: T__130
+                {
+                mT__130(); 
+
+                }
+                break;
+            case 119 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:749: T__131
+                {
+                mT__131(); 
+
+                }
+                break;
+            case 120 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:756: T__132
+                {
+                mT__132(); 
+
+                }
+                break;
+            case 121 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:763: T__133
+                {
+                mT__133(); 
+
+                }
+                break;
+            case 122 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:770: T__134
+                {
+                mT__134(); 
+
+                }
+                break;
+            case 123 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:777: T__135
+                {
+                mT__135(); 
+
+                }
+                break;
+            case 124 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:784: T__136
+                {
+                mT__136(); 
+
+                }
+                break;
+            case 125 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:791: T__137
+                {
+                mT__137(); 
+
+                }
+                break;
+            case 126 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:798: T__138
+                {
+                mT__138(); 
+
+                }
+                break;
+            case 127 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:805: T__139
+                {
+                mT__139(); 
+
+                }
+                break;
+            case 128 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:812: T__140
+                {
+                mT__140(); 
+
+                }
+                break;
+            case 129 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:819: T__141
+                {
+                mT__141(); 
+
+                }
+                break;
+            case 130 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:826: T__142
+                {
+                mT__142(); 
+
+                }
+                break;
+            case 131 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:833: T__143
+                {
+                mT__143(); 
+
+                }
+                break;
+            case 132 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:840: T__144
+                {
+                mT__144(); 
+
+                }
+                break;
+            case 133 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:847: T__145
+                {
+                mT__145(); 
+
+                }
+                break;
+            case 134 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:854: T__146
+                {
+                mT__146(); 
+
+                }
+                break;
+            case 135 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:861: T__147
+                {
+                mT__147(); 
+
+                }
+                break;
+            case 136 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:868: T__148
+                {
+                mT__148(); 
+
+                }
+                break;
+            case 137 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:875: T__149
+                {
+                mT__149(); 
+
+                }
+                break;
+            case 138 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:882: T__150
+                {
+                mT__150(); 
+
+                }
+                break;
+            case 139 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:889: T__151
+                {
+                mT__151(); 
+
+                }
+                break;
+            case 140 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:896: T__152
+                {
+                mT__152(); 
+
+                }
+                break;
+            case 141 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:903: T__153
+                {
+                mT__153(); 
+
+                }
+                break;
+            case 142 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:910: T__154
+                {
+                mT__154(); 
+
+                }
+                break;
+            case 143 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:917: T__155
+                {
+                mT__155(); 
+
+                }
+                break;
+            case 144 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:924: T__156
+                {
+                mT__156(); 
+
+                }
+                break;
+            case 145 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:931: T__157
+                {
+                mT__157(); 
+
+                }
+                break;
+            case 146 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:938: T__158
+                {
+                mT__158(); 
+
+                }
+                break;
+            case 147 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:945: T__159
+                {
+                mT__159(); 
+
+                }
+                break;
+            case 148 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:952: T__160
+                {
+                mT__160(); 
+
+                }
+                break;
+            case 149 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:959: T__161
+                {
+                mT__161(); 
+
+                }
+                break;
+            case 150 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:966: T__162
+                {
+                mT__162(); 
+
+                }
+                break;
+            case 151 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:973: T__163
+                {
+                mT__163(); 
+
+                }
+                break;
+            case 152 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:980: T__164
+                {
+                mT__164(); 
+
+                }
+                break;
+            case 153 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:987: T__165
+                {
+                mT__165(); 
+
+                }
+                break;
+            case 154 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:994: T__166
+                {
+                mT__166(); 
+
+                }
+                break;
+            case 155 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1001: T__167
+                {
+                mT__167(); 
+
+                }
+                break;
+            case 156 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1008: T__168
+                {
+                mT__168(); 
+
+                }
+                break;
+            case 157 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1015: T__169
+                {
+                mT__169(); 
+
+                }
+                break;
+            case 158 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1022: T__170
+                {
+                mT__170(); 
+
+                }
+                break;
+            case 159 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1029: T__171
+                {
+                mT__171(); 
+
+                }
+                break;
+            case 160 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1036: T__172
+                {
+                mT__172(); 
+
+                }
+                break;
+            case 161 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1043: T__173
+                {
+                mT__173(); 
+
+                }
+                break;
+            case 162 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1050: T__174
+                {
+                mT__174(); 
+
+                }
+                break;
+            case 163 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1057: T__175
+                {
+                mT__175(); 
+
+                }
+                break;
+            case 164 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1064: T__176
+                {
+                mT__176(); 
+
+                }
+                break;
+            case 165 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1071: T__177
+                {
+                mT__177(); 
+
+                }
+                break;
+            case 166 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1078: T__178
+                {
+                mT__178(); 
+
+                }
+                break;
+            case 167 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1085: T__179
+                {
+                mT__179(); 
+
+                }
+                break;
+            case 168 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1092: T__180
+                {
+                mT__180(); 
+
+                }
+                break;
+            case 169 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1099: T__181
+                {
+                mT__181(); 
+
+                }
+                break;
+            case 170 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1106: T__182
+                {
+                mT__182(); 
+
+                }
+                break;
+            case 171 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1113: T__183
+                {
+                mT__183(); 
+
+                }
+                break;
+            case 172 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1120: T__184
+                {
+                mT__184(); 
+
+                }
+                break;
+            case 173 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1127: T__185
+                {
+                mT__185(); 
+
+                }
+                break;
+            case 174 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1134: T__186
+                {
+                mT__186(); 
+
+                }
+                break;
+            case 175 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1141: T__187
+                {
+                mT__187(); 
+
+                }
+                break;
+            case 176 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1148: T__188
+                {
+                mT__188(); 
+
+                }
+                break;
+            case 177 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1155: T__189
+                {
+                mT__189(); 
+
+                }
+                break;
+            case 178 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1162: T__190
+                {
+                mT__190(); 
+
+                }
+                break;
+            case 179 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1169: T__191
+                {
+                mT__191(); 
+
+                }
+                break;
+            case 180 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1176: T__192
+                {
+                mT__192(); 
+
+                }
+                break;
+            case 181 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1183: T__193
+                {
+                mT__193(); 
+
+                }
+                break;
+            case 182 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1190: T__194
+                {
+                mT__194(); 
+
+                }
+                break;
+            case 183 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1197: T__195
+                {
+                mT__195(); 
+
+                }
+                break;
+            case 184 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1204: T__196
+                {
+                mT__196(); 
+
+                }
+                break;
+            case 185 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1211: T__197
+                {
+                mT__197(); 
+
+                }
+                break;
+            case 186 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1218: T__198
+                {
+                mT__198(); 
+
+                }
+                break;
+            case 187 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1225: T__199
+                {
+                mT__199(); 
+
+                }
+                break;
+            case 188 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1232: T__200
+                {
+                mT__200(); 
+
+                }
+                break;
+            case 189 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1239: T__201
+                {
+                mT__201(); 
+
+                }
+                break;
+            case 190 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1246: T__202
+                {
+                mT__202(); 
+
+                }
+                break;
+            case 191 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1253: T__203
+                {
+                mT__203(); 
+
+                }
+                break;
+            case 192 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1260: T__204
+                {
+                mT__204(); 
+
+                }
+                break;
+            case 193 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1267: T__205
+                {
+                mT__205(); 
+
+                }
+                break;
+            case 194 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1274: T__206
+                {
+                mT__206(); 
+
+                }
+                break;
+            case 195 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1281: T__207
+                {
+                mT__207(); 
+
+                }
+                break;
+            case 196 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1288: T__208
+                {
+                mT__208(); 
+
+                }
+                break;
+            case 197 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1295: T__209
+                {
+                mT__209(); 
+
+                }
+                break;
+            case 198 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1302: T__210
+                {
+                mT__210(); 
+
+                }
+                break;
+            case 199 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1309: T__211
+                {
+                mT__211(); 
+
+                }
+                break;
+            case 200 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1316: T__212
+                {
+                mT__212(); 
+
+                }
+                break;
+            case 201 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1323: T__213
+                {
+                mT__213(); 
+
+                }
+                break;
+            case 202 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1330: T__214
+                {
+                mT__214(); 
+
+                }
+                break;
+            case 203 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1337: T__215
+                {
+                mT__215(); 
+
+                }
+                break;
+            case 204 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1344: T__216
+                {
+                mT__216(); 
+
+                }
+                break;
+            case 205 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1351: T__217
+                {
+                mT__217(); 
+
+                }
+                break;
+            case 206 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1358: T__218
+                {
+                mT__218(); 
+
+                }
+                break;
+            case 207 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1365: T__219
+                {
+                mT__219(); 
+
+                }
+                break;
+            case 208 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1372: T__220
+                {
+                mT__220(); 
+
+                }
+                break;
+            case 209 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1379: T__221
+                {
+                mT__221(); 
+
+                }
+                break;
+            case 210 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1386: T__222
+                {
+                mT__222(); 
+
+                }
+                break;
+            case 211 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1393: T__223
+                {
+                mT__223(); 
+
+                }
+                break;
+            case 212 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1400: T__224
+                {
+                mT__224(); 
+
+                }
+                break;
+            case 213 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1407: T__225
+                {
+                mT__225(); 
+
+                }
+                break;
+            case 214 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1414: T__226
+                {
+                mT__226(); 
+
+                }
+                break;
+            case 215 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1421: T__227
+                {
+                mT__227(); 
+
+                }
+                break;
+            case 216 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1428: T__228
+                {
+                mT__228(); 
+
+                }
+                break;
+            case 217 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1435: T__229
+                {
+                mT__229(); 
+
+                }
+                break;
+            case 218 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1442: T__230
+                {
+                mT__230(); 
+
+                }
+                break;
+            case 219 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1449: T__231
+                {
+                mT__231(); 
+
+                }
+                break;
+            case 220 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1456: T__232
+                {
+                mT__232(); 
+
+                }
+                break;
+            case 221 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1463: T__233
+                {
+                mT__233(); 
+
+                }
+                break;
+            case 222 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1470: T__234
+                {
+                mT__234(); 
+
+                }
+                break;
+            case 223 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1477: T__235
+                {
+                mT__235(); 
+
+                }
+                break;
+            case 224 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1484: T__236
+                {
+                mT__236(); 
+
+                }
+                break;
+            case 225 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1491: T__237
+                {
+                mT__237(); 
+
+                }
+                break;
+            case 226 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1498: T__238
+                {
+                mT__238(); 
+
+                }
+                break;
+            case 227 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1505: T__239
+                {
+                mT__239(); 
+
+                }
+                break;
+            case 228 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1512: T__240
+                {
+                mT__240(); 
+
+                }
+                break;
+            case 229 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1519: T__241
+                {
+                mT__241(); 
+
+                }
+                break;
+            case 230 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1526: T__242
+                {
+                mT__242(); 
+
+                }
+                break;
+            case 231 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1533: T__243
+                {
+                mT__243(); 
+
+                }
+                break;
+            case 232 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1540: T__244
+                {
+                mT__244(); 
+
+                }
+                break;
+            case 233 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1547: T__245
+                {
+                mT__245(); 
+
+                }
+                break;
+            case 234 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1554: T__246
+                {
+                mT__246(); 
+
+                }
+                break;
+            case 235 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1561: T__247
+                {
+                mT__247(); 
+
+                }
+                break;
+            case 236 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1568: T__248
+                {
+                mT__248(); 
+
+                }
+                break;
+            case 237 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1575: T__249
+                {
+                mT__249(); 
+
+                }
+                break;
+            case 238 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1582: T__250
+                {
+                mT__250(); 
+
+                }
+                break;
+            case 239 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1589: T__251
+                {
+                mT__251(); 
+
+                }
+                break;
+            case 240 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1596: T__252
+                {
+                mT__252(); 
+
+                }
+                break;
+            case 241 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1603: T__253
+                {
+                mT__253(); 
+
+                }
+                break;
+            case 242 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1610: T__254
+                {
+                mT__254(); 
+
+                }
+                break;
+            case 243 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1617: T__255
+                {
+                mT__255(); 
+
+                }
+                break;
+            case 244 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1624: T__256
+                {
+                mT__256(); 
+
+                }
+                break;
+            case 245 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1631: T__257
+                {
+                mT__257(); 
+
+                }
+                break;
+            case 246 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1638: T__258
+                {
+                mT__258(); 
+
+                }
+                break;
+            case 247 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1645: T__259
+                {
+                mT__259(); 
+
+                }
+                break;
+            case 248 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1652: T__260
+                {
+                mT__260(); 
+
+                }
+                break;
+            case 249 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1659: T__261
+                {
+                mT__261(); 
+
+                }
+                break;
+            case 250 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1666: T__262
+                {
+                mT__262(); 
+
+                }
+                break;
+            case 251 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1673: T__263
+                {
+                mT__263(); 
+
+                }
+                break;
+            case 252 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1680: T__264
+                {
+                mT__264(); 
+
+                }
+                break;
+            case 253 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1687: T__265
+                {
+                mT__265(); 
+
+                }
+                break;
+            case 254 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1694: T__266
+                {
+                mT__266(); 
+
+                }
+                break;
+            case 255 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1701: T__267
+                {
+                mT__267(); 
+
+                }
+                break;
+            case 256 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1708: T__268
+                {
+                mT__268(); 
+
+                }
+                break;
+            case 257 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1715: T__269
+                {
+                mT__269(); 
+
+                }
+                break;
+            case 258 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1722: T__270
+                {
+                mT__270(); 
+
+                }
+                break;
+            case 259 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1729: RULE_HEX
+                {
+                mRULE_HEX(); 
+
+                }
+                break;
+            case 260 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1738: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 261 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1747: RULE_DECIMAL
+                {
+                mRULE_DECIMAL(); 
+
+                }
+                break;
+            case 262 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1760: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 263 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1768: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 264 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1780: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 265 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1796: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 266 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1812: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 267 :
+                // ../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g:1:1820: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA21 dfa21 = new DFA21(this);
+    static final String DFA21_eotS =
+        "\1\uffff\1\77\1\101\1\103\1\106\1\112\1\115\1\121\1\123\1\125\1"+
+        "\127\1\131\1\133\1\136\34\141\12\uffff\1\u00c7\2\u00ca\1\74\5\uffff"+
+        "\1\u00cf\26\uffff\1\u00d1\5\uffff\1\u00d3\4\uffff\2\141\1\uffff"+
+        "\14\141\1\u00e9\1\141\1\u00f0\1\141\1\u00f2\16\141\1\u0106\15\141"+
+        "\1\u0118\13\141\1\u0128\12\141\1\u0138\25\141\15\uffff\1\u00ca\12"+
+        "\uffff\1\u0158\1\u0159\13\141\1\u0166\7\141\1\uffff\6\141\1\uffff"+
+        "\1\u0174\1\uffff\6\141\1\u017b\7\141\1\u0186\2\141\1\u018a\1\141"+
+        "\1\uffff\3\141\1\u0195\15\141\1\uffff\2\141\1\u01a5\3\141\1\u01a9"+
+        "\10\141\1\uffff\6\141\1\u01bc\10\141\1\uffff\6\141\1\u01cd\30\141"+
+        "\2\uffff\3\141\1\u01ed\2\141\1\u01f1\5\141\1\uffff\1\141\1\u01f9"+
+        "\7\141\1\u0202\3\141\1\uffff\5\141\1\u020b\1\uffff\2\141\1\u020e"+
+        "\1\141\1\u0210\5\141\1\uffff\1\141\1\u0217\1\141\1\uffff\1\u0219"+
+        "\1\u021a\1\u021c\7\141\1\uffff\5\141\1\u0229\1\141\1\u022b\2\141"+
+        "\1\u022f\4\141\1\uffff\1\u0234\1\141\1\u0236\1\uffff\1\u0237\5\141"+
+        "\1\u023e\1\u023f\12\141\1\uffff\1\141\1\u024f\1\u0250\5\141\1\u0256"+
+        "\1\u0259\6\141\1\uffff\1\u0260\7\141\1\u0268\2\141\1\u026b\12\141"+
+        "\1\u0279\6\141\1\u0281\1\141\1\uffff\1\u0284\1\141\1\u0287\1\uffff"+
+        "\1\141\1\u028b\1\u028c\1\u028d\3\141\1\uffff\3\141\1\u0294\4\141"+
+        "\1\uffff\3\141\1\u029c\1\u029d\1\u029f\2\141\1\uffff\2\141\1\uffff"+
+        "\1\141\1\uffff\6\141\1\uffff\1\141\2\uffff\1\141\1\uffff\1\u02ae"+
+        "\7\141\1\u02b8\3\141\1\uffff\1\141\1\uffff\1\u02bd\2\141\1\uffff"+
+        "\1\u02c0\1\141\1\u02c2\1\141\1\uffff\1\141\2\uffff\1\u02c5\1\u02c8"+
+        "\4\141\2\uffff\1\141\1\u02ce\1\u02cf\1\u02d0\1\u02d1\1\u02d2\7\141"+
+        "\1\u02da\1\u02db\2\uffff\5\141\1\uffff\2\141\1\uffff\3\141\1\u02e6"+
+        "\2\141\1\uffff\2\141\1\u02eb\4\141\1\uffff\2\141\1\uffff\1\u02f5"+
+        "\7\141\1\u02fe\4\141\1\uffff\1\u0303\6\141\1\uffff\1\u030a\1\141"+
+        "\1\uffff\1\u030c\1\u030d\1\uffff\1\u030e\1\141\1\u0310\3\uffff\1"+
+        "\u0311\1\141\1\u0313\1\u0314\1\141\1\u0316\1\uffff\7\141\2\uffff"+
+        "\1\u031e\1\uffff\4\141\1\u0323\1\u0324\3\141\1\u0328\3\141\1\u032c"+
+        "\1\uffff\1\141\1\u032e\6\141\1\u0335\1\uffff\2\141\1\u0338\1\141"+
+        "\1\uffff\2\141\1\uffff\1\141\1\uffff\1\141\1\u033f\1\uffff\2\141"+
+        "\1\uffff\1\141\1\u0343\1\141\1\u0345\1\u0346\5\uffff\5\141\1\u034c"+
+        "\1\u034d\2\uffff\4\141\1\u0352\5\141\1\uffff\3\141\1\u035c\1\uffff"+
+        "\1\u035d\10\141\1\uffff\1\141\1\u0368\1\u0369\3\141\1\u036d\1\141"+
+        "\1\uffff\4\141\1\uffff\2\141\1\u0375\1\u0376\1\u0377\1\141\1\uffff"+
+        "\1\u0379\3\uffff\1\141\2\uffff\1\141\2\uffff\1\141\1\uffff\2\141"+
+        "\1\u037f\4\141\1\uffff\1\u0385\1\141\1\u0387\1\u0388\2\uffff\3\141"+
+        "\1\uffff\1\u038d\2\141\1\uffff\1\141\1\uffff\6\141\1\uffff\2\141"+
+        "\1\uffff\1\u039c\4\141\1\u03a1\1\uffff\3\141\1\uffff\1\141\2\uffff"+
+        "\1\u03a6\1\u03a7\1\u03a8\2\141\2\uffff\4\141\1\uffff\6\141\1\u03b5"+
+        "\2\141\2\uffff\1\u03b9\1\u03be\10\141\2\uffff\1\u03c8\2\141\1\uffff"+
+        "\3\141\1\u03ce\3\141\3\uffff\1\141\1\uffff\1\141\1\u03d8\1\141\1"+
+        "\u03da\1\141\1\uffff\5\141\1\uffff\1\u03e2\2\uffff\1\141\1\u03e4"+
+        "\1\141\1\u03e6\1\uffff\16\141\1\uffff\4\141\1\uffff\4\141\3\uffff"+
+        "\1\141\1\u0400\3\141\1\u0404\6\141\1\uffff\3\141\1\uffff\4\141\1"+
+        "\uffff\2\141\1\u0415\4\141\1\u041a\1\141\1\uffff\1\u041c\4\141\1"+
+        "\uffff\1\141\1\u0422\4\141\1\u0427\1\141\1\u0429\1\uffff\1\141\1"+
+        "\uffff\4\141\1\u042f\2\141\1\uffff\1\141\1\uffff\1\u0433\1\uffff"+
+        "\1\141\1\u0435\14\141\1\u0442\1\u0443\3\141\1\u0447\1\141\1\u0449"+
+        "\1\141\1\u044b\1\141\1\uffff\1\141\1\u044e\1\u044f\1\uffff\20\141"+
+        "\1\uffff\4\141\1\uffff\1\141\1\uffff\5\141\1\uffff\4\141\1\uffff"+
+        "\1\141\1\uffff\5\141\1\uffff\1\u0476\2\141\1\uffff\1\u0479\1\uffff"+
+        "\12\141\1\u0484\1\u0486\2\uffff\3\141\1\uffff\1\141\1\uffff\1\141"+
+        "\1\uffff\1\141\1\u048d\2\uffff\1\u048e\3\141\1\uffff\17\141\1\u04a1"+
+        "\1\u04a2\4\141\1\u04a7\1\u04a8\12\141\1\uffff\1\141\1\u04b4\1\uffff"+
+        "\2\141\1\u04b7\7\141\1\uffff\1\141\1\uffff\1\141\1\u04c2\2\141\1"+
+        "\u04c5\1\141\2\uffff\2\141\1\u04c9\2\141\1\u04cd\1\u04ce\1\u04cf"+
+        "\7\141\1\u04d7\1\u04d8\1\u04d9\2\uffff\2\141\1\u04dc\1\141\2\uffff"+
+        "\2\141\1\u04e0\1\141\1\u04e2\1\u04e3\1\141\1\u04e5\1\u04e6\2\141"+
+        "\1\uffff\1\u04e9\1\141\1\uffff\3\141\1\u04ee\3\141\1\u04f3\1\u04f4"+
+        "\1\u04f5\1\uffff\1\u04f6\1\u04f7\1\uffff\1\141\1\u04f9\1\141\1\uffff"+
+        "\3\141\3\uffff\1\u04fe\5\141\1\u0504\3\uffff\2\141\1\uffff\1\u0507"+
+        "\2\141\1\uffff\1\141\2\uffff\1\u050b\2\uffff\1\141\1\u050d\1\uffff"+
+        "\4\141\1\uffff\1\141\1\u0513\2\141\5\uffff\1\141\1\uffff\1\u0517"+
+        "\1\141\1\u0519\1\u051a\1\uffff\5\141\1\uffff\1\141\1\u0521\1\uffff"+
+        "\1\u0522\2\141\1\uffff\1\141\1\uffff\5\141\1\uffff\1\141\1\u052c"+
+        "\1\u052d\1\uffff\1\141\2\uffff\5\141\1\u0534\2\uffff\4\141\1\u0539"+
+        "\1\u053a\2\141\1\u053d\2\uffff\3\141\1\u0541\1\141\1\u0543\1\uffff"+
+        "\1\141\1\u0545\1\141\1\u0547\2\uffff\1\141\1\u0549\1\uffff\1\u054a"+
+        "\2\141\1\uffff\1\141\1\uffff\1\141\1\uffff\1\141\1\uffff\1\141\2"+
+        "\uffff\3\141\1\u0554\1\u0555\1\141\1\u0557\2\141\2\uffff\1\u055a"+
+        "\1\uffff\1\141\1\u055c\1\uffff\1\u055d\2\uffff";
+    static final String DFA21_eofS =
+        "\u055e\uffff";
+    static final String DFA21_minS =
+        "\1\0\1\75\1\174\1\46\1\53\1\55\2\52\3\75\1\76\2\56\2\141\1\143"+
+        "\1\144\1\141\1\157\1\156\1\157\1\141\1\164\3\145\2\141\1\143\2\141"+
+        "\1\156\1\145\1\143\6\141\1\162\12\uffff\1\72\2\60\1\44\5\uffff\1"+
+        "\75\26\uffff\1\75\5\uffff\1\74\4\uffff\1\154\1\163\1\uffff\1\164"+
+        "\1\162\1\156\1\145\1\163\1\141\1\160\1\150\1\141\1\151\1\156\1\141"+
+        "\1\44\1\110\1\44\1\146\1\44\1\154\1\145\1\156\1\157\1\162\1\157"+
+        "\1\164\1\156\1\165\1\164\1\162\1\147\1\171\1\141\1\44\1\170\1\160"+
+        "\1\162\1\164\1\61\1\141\1\155\1\154\1\151\1\163\1\154\1\144\1\151"+
+        "\1\44\2\164\1\144\1\156\1\155\1\167\1\154\1\151\1\162\1\164\1\144"+
+        "\1\44\1\162\2\147\1\167\1\150\1\143\1\162\1\145\1\101\1\106\1\44"+
+        "\1\164\1\146\1\163\1\157\1\146\1\156\1\171\1\141\1\146\1\143\1\151"+
+        "\2\162\1\156\1\144\2\145\1\162\1\160\1\162\1\143\15\uffff\1\60\12"+
+        "\uffff\2\44\1\151\1\145\1\157\1\61\1\156\1\145\1\164\1\162\1\145"+
+        "\1\157\1\145\1\44\1\162\1\144\1\164\1\143\1\157\1\147\1\156\1\uffff"+
+        "\1\157\2\164\1\145\1\151\1\164\1\uffff\1\44\1\uffff\1\163\1\145"+
+        "\1\154\1\141\1\143\1\155\1\44\1\154\1\145\1\147\1\142\1\145\1\151"+
+        "\1\147\1\44\1\147\1\156\1\44\1\145\1\uffff\1\164\1\145\1\157\1\44"+
+        "\1\144\1\162\1\141\1\146\1\147\1\164\1\156\1\153\1\164\1\144\1\150"+
+        "\1\154\1\151\1\uffff\1\145\1\151\1\44\1\145\1\155\1\145\1\44\1\154"+
+        "\1\143\1\156\1\143\1\164\1\145\1\141\1\146\1\uffff\1\143\1\145\1"+
+        "\151\1\162\1\157\1\150\1\44\1\145\1\141\1\142\1\156\1\145\1\155"+
+        "\1\141\1\156\1\uffff\1\141\1\143\1\151\2\141\1\160\1\44\1\164\1"+
+        "\145\1\157\1\143\1\64\1\153\1\155\1\156\1\164\1\120\1\151\1\61\1"+
+        "\145\1\146\1\165\2\141\1\163\1\164\1\145\1\143\1\151\1\161\1\157"+
+        "\2\uffff\1\142\1\156\1\162\1\44\1\62\1\164\1\44\2\145\1\162\1\154"+
+        "\1\144\1\uffff\1\143\1\44\1\143\1\150\1\162\1\145\1\164\1\165\1"+
+        "\164\1\44\1\162\1\163\1\141\1\uffff\1\145\2\144\1\154\1\164\1\44"+
+        "\1\uffff\1\145\1\147\1\44\1\154\1\44\1\156\1\145\1\157\1\164\1\141"+
+        "\1\uffff\1\147\1\44\1\163\1\uffff\3\44\1\167\1\120\1\157\1\163\1"+
+        "\162\1\143\1\162\1\uffff\1\141\1\144\1\156\1\142\1\150\1\44\1\151"+
+        "\1\44\1\150\1\157\1\44\1\145\1\163\1\143\1\157\1\uffff\1\44\1\141"+
+        "\1\44\1\uffff\1\44\2\153\2\157\1\162\2\44\1\137\1\61\1\64\1\157"+
+        "\1\162\1\163\1\151\1\162\1\166\1\164\1\uffff\1\162\2\44\1\104\1"+
+        "\141\1\143\1\157\1\151\2\44\2\162\1\143\1\171\1\165\1\154\1\uffff"+
+        "\1\44\1\104\1\165\1\145\1\61\1\141\1\145\1\164\1\44\1\162\1\160"+
+        "\1\44\1\63\1\61\1\162\1\151\1\155\1\162\1\164\1\157\1\151\1\104"+
+        "\1\44\1\150\1\143\1\165\1\144\1\154\1\144\1\44\1\163\1\uffff\1\44"+
+        "\1\70\1\44\1\uffff\1\143\3\44\1\154\1\165\1\150\1\uffff\1\150\1"+
+        "\162\1\164\1\44\1\151\1\143\1\160\1\141\1\uffff\1\103\1\151\1\156"+
+        "\3\44\1\154\1\151\1\uffff\1\141\1\145\1\uffff\1\145\1\uffff\1\147"+
+        "\1\163\1\141\1\162\1\144\1\145\1\uffff\1\151\2\uffff\1\146\1\uffff"+
+        "\1\44\1\101\1\167\1\145\1\157\1\145\1\151\1\164\1\44\1\151\1\154"+
+        "\1\164\1\uffff\1\156\1\uffff\1\44\1\167\1\141\1\uffff\1\44\1\164"+
+        "\1\44\1\156\1\uffff\1\154\2\uffff\2\44\1\144\1\156\1\154\1\163\2"+
+        "\uffff\1\163\5\44\1\61\1\144\1\163\1\164\1\145\1\156\1\145\2\44"+
+        "\2\uffff\1\162\1\164\1\145\1\165\1\154\1\uffff\1\141\1\162\1\uffff"+
+        "\1\157\1\151\1\145\1\44\1\154\1\141\1\uffff\1\151\1\164\1\44\1\67"+
+        "\1\147\1\156\1\102\1\uffff\1\151\1\150\1\uffff\1\44\1\142\1\71\1"+
+        "\63\1\62\1\157\1\147\1\156\1\44\1\145\1\162\1\157\1\162\1\uffff"+
+        "\1\44\1\157\3\145\1\163\1\151\1\uffff\1\44\1\163\1\uffff\2\44\1"+
+        "\uffff\1\44\1\141\1\44\3\uffff\1\44\1\154\2\44\1\157\1\44\1\uffff"+
+        "\1\164\1\150\1\163\1\154\1\150\1\142\1\143\2\uffff\1\44\1\uffff"+
+        "\1\171\1\157\1\156\1\162\2\44\1\164\1\162\1\157\1\44\1\162\1\164"+
+        "\1\141\1\44\1\uffff\1\144\1\44\1\162\1\167\2\145\1\147\1\141\1\44"+
+        "\1\uffff\1\172\1\157\1\44\1\147\1\uffff\1\110\1\163\1\uffff\1\151"+
+        "\1\uffff\1\163\1\44\1\uffff\1\145\1\141\1\uffff\1\145\1\44\1\151"+
+        "\2\44\5\uffff\1\67\3\145\1\166\2\44\2\uffff\1\141\2\151\1\156\1"+
+        "\44\1\164\1\157\1\171\1\142\1\102\1\uffff\1\164\1\171\1\163\1\44"+
+        "\1\uffff\1\44\1\145\1\164\1\141\1\165\1\157\1\145\1\156\1\145\1"+
+        "\uffff\1\141\2\44\1\70\1\154\1\165\1\44\1\145\1\uffff\1\127\1\124"+
+        "\1\156\1\141\1\uffff\1\144\1\145\3\44\1\157\1\uffff\1\44\3\uffff"+
+        "\1\143\2\uffff\1\145\2\uffff\1\156\1\uffff\1\171\1\104\1\44\1\105"+
+        "\1\141\1\154\1\145\1\uffff\1\44\1\156\2\44\2\uffff\1\124\1\144\1"+
+        "\153\1\uffff\1\44\1\151\1\164\1\uffff\1\144\1\uffff\1\101\1\163"+
+        "\1\156\1\145\1\147\1\142\1\uffff\1\145\1\143\1\uffff\1\44\1\145"+
+        "\1\151\1\163\1\166\1\44\1\uffff\1\166\1\164\1\124\1\uffff\1\156"+
+        "\2\uffff\3\44\1\162\1\145\2\uffff\1\167\1\157\1\160\1\164\1\uffff"+
+        "\1\162\1\166\1\127\1\164\1\145\1\162\1\44\1\102\1\160\2\uffff\2"+
+        "\44\1\162\2\164\1\162\1\160\1\164\2\162\2\uffff\1\44\1\163\1\162"+
+        "\1\uffff\1\166\1\151\1\171\1\44\1\167\1\145\1\106\3\uffff\1\156"+
+        "\1\uffff\1\150\1\44\1\151\1\44\1\145\1\uffff\1\164\1\166\1\162\1"+
+        "\145\1\157\1\uffff\1\44\2\uffff\1\145\1\44\1\145\1\44\1\uffff\1"+
+        "\157\1\145\1\162\1\147\2\141\1\155\1\145\1\127\1\156\1\145\1\141"+
+        "\1\144\1\153\1\uffff\1\151\1\144\1\167\1\145\1\uffff\2\145\1\171"+
+        "\1\145\3\uffff\1\102\1\44\1\145\1\156\1\164\1\44\4\151\1\144\1\151"+
+        "\1\uffff\1\151\1\145\1\154\1\uffff\1\160\1\154\1\143\1\145\1\uffff"+
+        "\1\143\1\155\1\44\1\155\1\157\1\145\1\141\1\44\1\160\1\uffff\1\44"+
+        "\1\141\1\151\1\156\1\160\1\uffff\1\145\1\44\1\157\1\145\1\171\1"+
+        "\156\1\44\1\151\1\44\1\uffff\1\172\1\uffff\1\166\1\141\1\145\1\141"+
+        "\1\44\1\146\1\162\1\uffff\1\170\1\uffff\1\44\1\uffff\1\156\1\44"+
+        "\2\145\1\155\2\163\1\151\1\141\1\162\1\151\1\110\2\162\2\44\1\147"+
+        "\1\164\1\157\1\44\1\162\1\44\1\160\1\44\1\151\1\uffff\1\162\2\44"+
+        "\1\uffff\1\170\1\144\1\156\1\157\1\40\1\147\1\164\1\170\1\141\1"+
+        "\145\1\157\1\153\1\164\1\147\1\157\1\141\1\uffff\1\141\2\162\1\154"+
+        "\1\uffff\1\141\1\uffff\1\164\1\143\1\144\1\145\1\162\1\uffff\1\162"+
+        "\2\160\1\151\1\uffff\1\156\1\uffff\1\145\1\151\1\164\1\156\1\143"+
+        "\1\uffff\1\44\1\157\1\164\1\uffff\1\44\1\uffff\1\163\1\156\1\145"+
+        "\1\163\1\151\1\156\1\151\1\114\1\144\1\145\2\44\2\uffff\2\150\1"+
+        "\162\1\uffff\1\163\1\uffff\1\145\1\uffff\1\164\1\44\2\uffff\1\44"+
+        "\1\145\1\144\1\156\1\uffff\1\150\1\155\1\164\1\171\1\156\1\163\1"+
+        "\156\1\150\1\145\1\151\1\160\1\144\1\160\1\154\1\164\2\44\1\162"+
+        "\1\151\1\145\1\157\2\44\1\155\2\145\1\164\1\145\1\144\1\143\1\145"+
+        "\2\164\1\uffff\1\165\1\44\1\uffff\1\163\1\164\1\44\1\167\2\164\1"+
+        "\154\1\157\1\164\1\151\1\uffff\1\145\1\uffff\1\164\1\44\1\144\1"+
+        "\145\1\44\1\155\2\uffff\1\162\1\157\1\44\1\164\1\141\3\44\1\145"+
+        "\2\157\1\162\1\163\1\157\1\145\3\44\2\uffff\1\163\1\157\1\44\1\167"+
+        "\2\uffff\2\141\1\44\1\127\2\44\1\145\2\44\1\145\1\160\1\uffff\1"+
+        "\44\1\111\1\uffff\1\157\1\151\1\123\1\44\1\143\1\150\1\147\3\44"+
+        "\1\uffff\2\44\1\uffff\1\141\1\44\1\167\1\uffff\1\156\1\160\1\164"+
+        "\3\uffff\1\44\1\167\1\162\1\163\1\164\1\156\1\44\3\uffff\1\145\1"+
+        "\156\1\uffff\1\44\2\164\1\uffff\1\141\2\uffff\1\44\2\uffff\1\162"+
+        "\1\44\1\uffff\1\156\1\162\1\157\1\145\1\uffff\1\141\1\44\1\150\1"+
+        "\163\5\uffff\1\160\1\uffff\1\44\1\145\2\44\1\uffff\1\154\1\151\1"+
+        "\141\1\162\1\163\1\uffff\1\144\1\44\1\uffff\1\44\1\127\1\151\1\uffff"+
+        "\1\127\1\uffff\1\146\1\144\1\156\1\162\1\154\1\uffff\1\164\2\44"+
+        "\1\uffff\1\163\2\uffff\1\145\1\172\1\154\1\141\1\145\1\44\2\uffff"+
+        "\1\141\1\164\1\141\1\157\2\44\1\166\1\145\1\44\2\uffff\1\163\1\144"+
+        "\1\141\1\44\1\164\1\44\1\uffff\1\151\1\44\1\151\1\44\2\uffff\1\151"+
+        "\1\44\1\uffff\1\44\1\147\1\164\1\uffff\1\151\1\uffff\1\164\1\uffff"+
+        "\1\164\1\uffff\1\143\2\uffff\1\145\1\151\1\157\2\44\1\145\1\44\1"+
+        "\157\1\156\2\uffff\1\44\1\uffff\1\156\1\44\1\uffff\1\44\2\uffff";
+    static final String DFA21_maxS =
+        "\1\uffff\1\76\1\174\1\46\1\75\1\76\5\75\1\76\1\56\1\72\1\151\1"+
+        "\170\1\171\1\164\1\165\1\157\1\156\2\157\1\165\1\145\1\171\2\165"+
+        "\1\151\1\172\2\165\1\161\1\157\2\164\1\151\1\162\1\141\1\165\1\141"+
+        "\1\162\12\uffff\1\72\1\170\1\154\1\172\5\uffff\1\75\26\uffff\1\75"+
+        "\5\uffff\1\74\4\uffff\1\162\1\163\1\uffff\1\164\1\162\1\156\1\145"+
+        "\1\163\1\157\1\160\1\162\1\164\1\151\1\156\1\160\1\172\1\124\1\172"+
+        "\1\146\1\172\1\154\1\170\1\156\1\157\1\162\1\157\1\164\1\156\1\165"+
+        "\1\164\1\162\1\147\2\171\1\172\1\170\1\160\1\162\1\164\1\61\1\141"+
+        "\1\155\1\154\1\151\1\163\1\162\1\164\1\151\1\172\2\164\1\144\1\162"+
+        "\1\155\1\167\1\154\1\157\1\162\1\164\1\144\1\172\1\162\1\166\1\147"+
+        "\1\167\1\150\1\143\1\162\1\145\1\122\1\106\1\172\1\164\1\166\1\163"+
+        "\1\157\1\146\1\156\1\171\1\141\1\146\1\171\1\151\1\163\1\162\2\156"+
+        "\2\145\1\162\1\164\1\170\1\143\15\uffff\1\154\12\uffff\2\172\1\151"+
+        "\1\145\1\157\1\70\1\156\1\145\1\164\1\162\1\145\1\157\1\145\1\172"+
+        "\1\162\1\144\1\164\1\143\1\157\1\147\1\156\1\uffff\1\157\2\164\1"+
+        "\145\1\151\1\164\1\uffff\1\172\1\uffff\1\163\1\145\1\154\1\141\1"+
+        "\143\1\155\1\172\1\154\1\145\1\147\1\142\1\145\1\151\1\147\1\172"+
+        "\1\147\1\171\1\172\1\145\1\uffff\1\164\1\145\1\157\1\172\1\144\1"+
+        "\162\1\141\1\146\1\147\1\164\1\156\1\153\1\164\1\144\1\150\1\154"+
+        "\1\151\1\uffff\1\145\1\151\1\172\1\145\1\155\1\145\1\172\1\154\1"+
+        "\143\1\156\1\143\1\164\2\145\1\146\1\uffff\1\143\1\145\1\151\1\165"+
+        "\1\157\1\150\1\172\1\145\1\141\1\142\1\162\1\145\1\155\1\141\1\156"+
+        "\1\uffff\1\141\1\164\1\151\2\141\1\160\1\172\1\164\1\145\1\157\1"+
+        "\143\1\64\1\153\1\155\1\156\1\164\1\120\1\151\1\70\1\145\1\164\1"+
+        "\165\2\141\1\163\1\164\1\150\1\143\1\151\1\161\1\157\2\uffff\1\142"+
+        "\1\156\1\162\1\172\1\63\1\164\1\172\1\151\1\145\1\162\1\154\1\144"+
+        "\1\uffff\1\143\1\172\1\143\1\150\1\162\1\145\1\164\1\165\1\164\1"+
+        "\172\1\162\1\163\1\141\1\uffff\1\145\2\144\1\154\1\164\1\172\1\uffff"+
+        "\1\145\1\147\1\172\1\154\1\172\1\156\1\145\1\157\1\164\1\141\1\uffff"+
+        "\1\147\1\172\1\163\1\uffff\3\172\1\167\1\120\1\157\1\163\1\162\1"+
+        "\143\1\162\1\uffff\1\141\1\144\1\156\1\142\1\150\1\172\1\151\1\172"+
+        "\1\150\1\157\1\172\1\145\1\163\1\143\1\157\1\uffff\1\172\1\141\1"+
+        "\172\1\uffff\1\172\2\153\2\157\1\162\2\172\1\137\1\65\1\64\1\157"+
+        "\1\162\1\163\1\151\1\162\1\166\1\164\1\uffff\1\162\2\172\1\104\1"+
+        "\141\1\143\1\157\1\151\2\172\2\162\1\143\1\171\1\165\1\154\1\uffff"+
+        "\1\172\1\104\1\165\1\145\1\61\1\141\1\145\1\164\1\172\1\162\1\160"+
+        "\1\172\1\63\1\141\1\162\1\151\1\155\1\162\1\164\1\157\1\151\1\104"+
+        "\1\172\1\150\1\143\1\165\1\144\1\154\1\163\1\172\1\163\1\uffff\1"+
+        "\172\1\70\1\172\1\uffff\1\143\3\172\1\154\1\165\1\150\1\uffff\1"+
+        "\150\1\162\1\164\1\172\1\151\1\143\1\160\1\141\1\uffff\1\103\1\151"+
+        "\1\156\3\172\1\154\1\151\1\uffff\1\141\1\145\1\uffff\1\145\1\uffff"+
+        "\1\147\1\163\1\141\1\162\1\144\1\145\1\uffff\1\154\2\uffff\1\146"+
+        "\1\uffff\1\172\1\101\1\167\1\145\1\157\1\162\1\151\1\164\1\172\1"+
+        "\151\1\154\1\164\1\uffff\1\156\1\uffff\1\172\1\167\1\141\1\uffff"+
+        "\1\172\1\164\1\172\1\156\1\uffff\1\154\2\uffff\2\172\1\144\1\156"+
+        "\1\154\1\163\2\uffff\1\163\5\172\1\61\1\144\1\163\1\164\1\145\1"+
+        "\156\1\145\2\172\2\uffff\1\162\1\164\1\145\1\165\1\154\1\uffff\1"+
+        "\141\1\162\1\uffff\1\157\1\151\1\145\1\172\1\154\1\141\1\uffff\1"+
+        "\151\1\164\1\172\1\67\1\147\1\156\1\122\1\uffff\1\151\1\150\1\uffff"+
+        "\1\172\1\142\1\71\1\63\1\62\1\157\1\147\1\156\1\172\1\145\1\162"+
+        "\1\157\1\162\1\uffff\1\172\1\157\3\145\1\163\1\151\1\uffff\1\172"+
+        "\1\163\1\uffff\2\172\1\uffff\1\172\1\141\1\172\3\uffff\1\172\1\154"+
+        "\2\172\1\157\1\172\1\uffff\1\164\1\150\1\163\1\154\1\150\1\142\1"+
+        "\143\2\uffff\1\172\1\uffff\1\171\1\157\1\156\1\162\2\172\1\164\1"+
+        "\162\1\157\1\172\1\162\1\164\1\141\1\172\1\uffff\1\144\1\172\1\162"+
+        "\1\167\2\145\1\147\1\141\1\172\1\uffff\1\172\1\157\1\172\1\147\1"+
+        "\uffff\1\127\1\163\1\uffff\1\151\1\uffff\1\163\1\172\1\uffff\1\145"+
+        "\1\141\1\uffff\1\145\1\172\1\151\2\172\5\uffff\1\67\3\145\1\166"+
+        "\2\172\2\uffff\1\141\2\151\1\156\1\172\1\164\1\157\1\171\1\160\1"+
+        "\102\1\uffff\1\164\1\171\1\163\1\172\1\uffff\1\172\1\145\1\164\1"+
+        "\151\1\165\1\157\1\145\1\156\1\145\1\uffff\1\141\2\172\1\70\1\154"+
+        "\1\165\1\172\1\145\1\uffff\1\127\1\124\1\156\1\141\1\uffff\1\144"+
+        "\1\145\3\172\1\157\1\uffff\1\172\3\uffff\1\143\2\uffff\1\145\2\uffff"+
+        "\1\156\1\uffff\1\171\1\104\1\172\1\123\1\141\1\154\1\145\1\uffff"+
+        "\1\172\1\156\2\172\2\uffff\1\124\1\144\1\153\1\uffff\1\172\1\151"+
+        "\1\164\1\uffff\1\144\1\uffff\1\120\1\163\1\156\1\145\1\147\1\142"+
+        "\1\uffff\1\145\1\143\1\uffff\1\172\1\145\1\151\1\163\1\166\1\172"+
+        "\1\uffff\1\166\1\164\1\124\1\uffff\1\156\2\uffff\3\172\1\162\1\145"+
+        "\2\uffff\1\167\1\157\1\160\1\164\1\uffff\1\162\1\166\1\127\1\164"+
+        "\1\145\1\162\1\172\1\124\1\160\2\uffff\2\172\1\162\2\164\1\162\1"+
+        "\160\1\164\2\162\2\uffff\1\172\1\163\1\162\1\uffff\1\166\1\151\1"+
+        "\171\1\172\1\167\1\145\1\125\3\uffff\1\156\1\uffff\1\150\1\172\1"+
+        "\151\1\172\1\145\1\uffff\1\164\1\166\1\162\1\145\1\157\1\uffff\1"+
+        "\172\2\uffff\1\145\1\172\1\145\1\172\1\uffff\1\157\1\145\1\162\1"+
+        "\147\1\141\1\162\1\155\1\145\1\127\1\156\1\145\1\141\1\144\1\153"+
+        "\1\uffff\1\151\1\144\1\167\1\145\1\uffff\2\145\1\171\1\145\3\uffff"+
+        "\1\102\1\172\1\145\1\156\1\164\1\172\4\151\1\144\1\151\1\uffff\1"+
+        "\151\1\145\1\154\1\uffff\1\160\1\154\1\165\1\145\1\uffff\1\143\1"+
+        "\155\1\172\1\155\1\157\1\145\1\141\1\172\1\160\1\uffff\1\172\1\141"+
+        "\1\151\1\156\1\160\1\uffff\1\145\1\172\1\157\1\145\1\171\1\156\1"+
+        "\172\1\151\1\172\1\uffff\1\172\1\uffff\1\166\1\141\1\145\1\141\1"+
+        "\172\1\146\1\162\1\uffff\1\170\1\uffff\1\172\1\uffff\1\156\1\172"+
+        "\2\145\1\155\2\163\1\151\1\141\1\162\1\151\1\110\2\162\2\172\1\147"+
+        "\1\164\1\157\1\172\1\162\1\172\1\160\1\172\1\151\1\uffff\1\162\2"+
+        "\172\1\uffff\1\170\1\144\1\156\1\157\1\40\1\147\1\164\1\170\1\141"+
+        "\1\145\1\157\1\153\1\164\1\166\1\157\1\141\1\uffff\1\141\2\162\1"+
+        "\154\1\uffff\1\141\1\uffff\1\164\1\143\1\144\1\145\1\162\1\uffff"+
+        "\1\162\2\160\1\151\1\uffff\1\156\1\uffff\1\145\1\151\1\164\1\156"+
+        "\1\143\1\uffff\1\172\1\157\1\164\1\uffff\1\172\1\uffff\1\163\1\156"+
+        "\1\145\1\163\1\151\1\156\1\151\1\114\1\144\1\145\2\172\2\uffff\2"+
+        "\150\1\162\1\uffff\1\163\1\uffff\1\145\1\uffff\1\164\1\172\2\uffff"+
+        "\1\172\1\145\1\144\1\156\1\uffff\1\150\1\155\1\164\1\171\1\156\1"+
+        "\163\1\156\1\150\1\145\1\151\1\160\1\144\1\160\1\154\1\164\2\172"+
+        "\1\162\1\151\1\145\1\157\2\172\1\155\2\145\1\164\1\145\1\144\1\143"+
+        "\1\145\2\164\1\uffff\1\165\1\172\1\uffff\1\163\1\164\1\172\1\167"+
+        "\2\164\1\154\1\157\1\164\1\151\1\uffff\1\163\1\uffff\1\164\1\172"+
+        "\1\144\1\145\1\172\1\155\2\uffff\1\162\1\157\1\172\1\164\1\141\3"+
+        "\172\1\145\2\157\1\162\1\163\1\157\1\145\3\172\2\uffff\1\163\1\157"+
+        "\1\172\1\167\2\uffff\2\141\1\172\1\127\2\172\1\145\2\172\1\145\1"+
+        "\160\1\uffff\1\172\1\111\1\uffff\1\157\1\151\1\123\1\172\1\143\1"+
+        "\150\1\147\3\172\1\uffff\2\172\1\uffff\1\141\1\172\1\167\1\uffff"+
+        "\1\156\1\160\1\164\3\uffff\1\172\1\167\1\162\1\163\1\164\1\156\1"+
+        "\172\3\uffff\1\145\1\156\1\uffff\1\172\2\164\1\uffff\1\141\2\uffff"+
+        "\1\172\2\uffff\1\162\1\172\1\uffff\1\156\1\162\1\157\1\145\1\uffff"+
+        "\1\141\1\172\1\150\1\163\5\uffff\1\160\1\uffff\1\172\1\145\2\172"+
+        "\1\uffff\1\154\1\151\1\141\1\162\1\163\1\uffff\1\144\1\172\1\uffff"+
+        "\1\172\1\127\1\151\1\uffff\1\127\1\uffff\1\146\1\144\1\156\1\162"+
+        "\1\154\1\uffff\1\164\2\172\1\uffff\1\163\2\uffff\1\145\1\172\1\154"+
+        "\1\141\1\145\1\172\2\uffff\1\141\1\164\1\141\1\157\2\172\1\166\1"+
+        "\145\1\172\2\uffff\1\163\1\144\1\141\1\172\1\164\1\172\1\uffff\1"+
+        "\151\1\172\1\151\1\172\2\uffff\1\151\1\172\1\uffff\1\172\1\147\1"+
+        "\164\1\uffff\1\151\1\uffff\1\164\1\uffff\1\164\1\uffff\1\143\2\uffff"+
+        "\1\145\1\151\1\157\2\172\1\145\1\172\1\157\1\156\2\uffff\1\172\1"+
+        "\uffff\1\156\1\172\1\uffff\1\172\2\uffff";
+    static final String DFA21_acceptS =
+        "\52\uffff\1\172\1\173\1\u0087\1\u00ba\1\u00bb\1\u00c8\1\u00e1\1"+
+        "\u00e2\1\u00e3\1\u00e6\4\uffff\1\u0106\2\u0107\1\u010a\1\u010b\1"+
+        "\uffff\1\23\1\1\1\2\1\u0100\1\3\1\u00fa\1\4\1\35\1\26\1\5\1\20\1"+
+        "\36\1\27\1\6\1\31\1\30\1\7\1\u0108\1\u0109\1\32\1\10\1\33\1\uffff"+
+        "\1\34\1\15\1\16\1\24\1\17\1\uffff\1\37\1\25\1\u00ff\1\u00f9\2\uffff"+
+        "\1\u0106\132\uffff\1\172\1\173\1\u0087\1\u00ba\1\u00bb\1\u00c8\1"+
+        "\u00e1\1\u00e2\1\u00e3\1\u00e6\1\u00fe\1\u00ea\1\u0103\1\uffff\1"+
+        "\u0104\1\u0105\1\u0107\1\u010a\1\13\1\11\1\14\1\12\1\21\1\22\25"+
+        "\uffff\1\u0097\6\uffff\1\u00d0\1\uffff\1\u00e7\23\uffff\1\133\21"+
+        "\uffff\1\u00e5\17\uffff\1\114\17\uffff\1\u00ef\37\uffff\1\40\1\u0101"+
+        "\14\uffff\1\u00c9\15\uffff\1\134\6\uffff\1\u00ed\12\uffff\1\u00dc"+
+        "\3\uffff\1\u00f5\12\uffff\1\u00c7\17\uffff\1\u00fc\3\uffff\1\u00f0"+
+        "\22\uffff\1\u008d\20\uffff\1\u00c6\37\uffff\1\130\3\uffff\1\u00e8"+
+        "\7\uffff\1\u00e0\10\uffff\1\120\10\uffff\1\u00b7\2\uffff\1\51\1"+
+        "\uffff\1\54\6\uffff\1\102\1\uffff\1\u0102\1\u0099\1\uffff\1\u00bf"+
+        "\14\uffff\1\u00ab\1\uffff\1\121\3\uffff\1\u00c2\4\uffff\1\104\1"+
+        "\uffff\1\u00a9\1\u00f1\6\uffff\1\125\1\126\17\uffff\1\153\1\154"+
+        "\5\uffff\1\115\2\uffff\1\u00a3\6\uffff\1\116\7\uffff\1\u00ac\2\uffff"+
+        "\1\127\15\uffff\1\u00ec\7\uffff\1\101\2\uffff\1\132\2\uffff\1\u0083"+
+        "\3\uffff\1\u0084\1\u00c1\1\45\6\uffff\1\u00ce\7\uffff\1\46\1\105"+
+        "\1\uffff\1\u00dd\16\uffff\1\u00f3\11\uffff\1\u00bc\4\uffff\1\u0090"+
+        "\2\uffff\1\u00ee\1\uffff\1\167\2\uffff\1\106\2\uffff\1\113\5\uffff"+
+        "\1\143\1\144\1\145\1\146\1\147\7\uffff\1\117\1\112\12\uffff\1\u00df"+
+        "\4\uffff\1\122\11\uffff\1\131\10\uffff\1\u00ca\4\uffff\1\u00f8\6"+
+        "\uffff\1\150\1\uffff\1\152\1\u0080\1\42\1\uffff\1\u0082\1\u00a0"+
+        "\1\uffff\1\u00cf\1\u00e9\1\uffff\1\43\7\uffff\1\u00d3\4\uffff\1"+
+        "\52\1\53\3\uffff\1\u00d2\3\uffff\1\u00f2\1\uffff\1\62\6\uffff\1"+
+        "\u0089\2\uffff\1\u008f\6\uffff\1\123\3\uffff\1\u00db\1\uffff\1\141"+
+        "\1\142\5\uffff\1\u00f4\1\u00cb\4\uffff\1\u00fd\11\uffff\1\u00de"+
+        "\1\162\12\uffff\1\136\1\137\3\uffff\1\u008e\7\uffff\1\165\1\u00cc"+
+        "\1\41\1\uffff\1\151\5\uffff\1\65\5\uffff\1\u00f6\1\uffff\1\47\1"+
+        "\50\4\uffff\1\57\16\uffff\1\100\4\uffff\1\u0088\4\uffff\1\170\1"+
+        "\166\1\111\14\uffff\1\u00eb\3\uffff\1\171\4\uffff\1\u00d9\11\uffff"+
+        "\1\140\5\uffff\1\u00bd\11\uffff\1\u00d1\1\uffff\1\60\7\uffff\1\u00c0"+
+        "\1\uffff\1\56\1\uffff\1\u0085\31\uffff\1\u00c3\3\uffff\1\u00b5\20"+
+        "\uffff\1\u00a6\4\uffff\1\135\1\uffff\1\u0081\5\uffff\1\163\4\uffff"+
+        "\1\44\1\uffff\1\u00d5\5\uffff\1\u00cd\3\uffff\1\u0086\1\uffff\1"+
+        "\u00c5\14\uffff\1\77\1\107\3\uffff\1\103\1\uffff\1\u008a\1\uffff"+
+        "\1\110\2\uffff\1\u00b9\1\u00b1\4\uffff\1\u00fb\41\uffff\1\u00e4"+
+        "\2\uffff\1\u00c4\12\uffff\1\76\1\uffff\1\156\6\uffff\1\u00a1\1\164"+
+        "\22\uffff\1\u00d7\1\u00da\4\uffff\1\u0093\1\u00d8\13\uffff\1\55"+
+        "\2\uffff\1\67\12\uffff\1\u0092\2\uffff\1\u00a4\3\uffff\1\u00be\3"+
+        "\uffff\1\u0098\1\u00d6\1\u00aa\7\uffff\1\u00a5\1\u00a7\1\u00b8\2"+
+        "\uffff\1\u008b\3\uffff\1\u009e\1\uffff\1\174\1\u00f7\1\uffff\1\175"+
+        "\1\176\2\uffff\1\61\4\uffff\1\71\4\uffff\1\157\1\160\1\u0091\1\u00b0"+
+        "\1\124\1\uffff\1\u00d4\4\uffff\1\u00ad\5\uffff\1\u00a2\2\uffff\1"+
+        "\u008c\3\uffff\1\64\1\uffff\1\177\5\uffff\1\74\3\uffff\1\u0094\1"+
+        "\uffff\1\u0096\1\u009a\6\uffff\1\u00b3\1\u009c\11\uffff\1\161\1"+
+        "\u00a8\6\uffff\1\155\4\uffff\1\70\1\72\2\uffff\1\75\3\uffff\1\u00af"+
+        "\1\uffff\1\u00b6\1\uffff\1\u009f\1\uffff\1\63\1\uffff\1\66\1\u0095"+
+        "\11\uffff\1\u009d\1\u009b\1\uffff\1\u00ae\2\uffff\1\73\1\uffff\1"+
+        "\u00b2\1\u00b4";
+    static final String DFA21_specialS =
+        "\1\0\u055d\uffff}>";
+    static final String[] DFA21_transitionS = {
+            "\11\74\2\73\2\74\1\73\22\74\1\73\1\11\1\71\1\61\1\70\1\10\1"+
+            "\3\1\72\1\55\1\56\1\6\1\4\1\57\1\5\1\14\1\7\1\65\11\66\1\64"+
+            "\1\63\1\13\1\1\1\12\1\15\1\54\1\70\1\23\1\70\1\26\4\70\1\24"+
+            "\2\70\1\25\6\70\1\27\7\70\1\62\1\74\1\60\1\67\1\70\1\74\1\35"+
+            "\1\37\1\47\1\43\1\17\1\22\1\32\1\33\1\21\1\46\1\30\1\44\1\50"+
+            "\1\36\1\42\1\45\1\51\1\41\1\20\1\31\1\40\1\16\1\34\3\70\1\52"+
+            "\1\2\1\53\uff82\74",
+            "\1\75\1\76",
+            "\1\100",
+            "\1\102",
+            "\1\105\21\uffff\1\104",
+            "\1\111\17\uffff\1\107\1\110",
+            "\1\114\22\uffff\1\113",
+            "\1\117\4\uffff\1\120\15\uffff\1\116",
+            "\1\122",
+            "\1\124",
+            "\1\126",
+            "\1\130",
+            "\1\132",
+            "\1\135\13\uffff\1\134",
+            "\1\137\7\uffff\1\140",
+            "\1\144\12\uffff\1\146\5\uffff\1\143\3\uffff\1\145\1\uffff"+
+            "\1\142",
+            "\1\151\1\uffff\1\152\16\uffff\1\147\1\150\1\uffff\1\153\1"+
+            "\uffff\1\154",
+            "\1\156\1\uffff\1\162\6\uffff\1\155\1\160\4\uffff\1\157\1\161",
+            "\1\163\7\uffff\1\164\5\uffff\1\167\2\uffff\1\166\2\uffff\1"+
+            "\165",
+            "\1\170",
+            "\1\171",
+            "\1\172",
+            "\1\174\15\uffff\1\173",
+            "\1\175\1\176",
+            "\1\177",
+            "\1\u0082\1\u0081\1\uffff\1\u0084\11\uffff\1\u0080\6\uffff"+
+            "\1\u0083",
+            "\1\u0085\15\uffff\1\u0086\1\uffff\1\u0087",
+            "\1\u0089\3\uffff\1\u008a\11\uffff\1\u008b\5\uffff\1\u0088",
+            "\1\u008c\6\uffff\1\u008e\1\u008d",
+            "\1\u0091\12\uffff\1\u0092\4\uffff\1\u008f\6\uffff\1\u0090",
+            "\1\u0094\3\uffff\1\u0095\11\uffff\1\u0093\5\uffff\1\u0096",
+            "\1\u0098\12\uffff\1\u0097\10\uffff\1\u0099",
+            "\1\u009a\1\uffff\1\u009b\1\u009c",
+            "\1\u009d\3\uffff\1\u009e\5\uffff\1\u009f",
+            "\1\u00a2\2\uffff\1\u00a4\7\uffff\1\u00a5\1\uffff\1\u00a3\1"+
+            "\uffff\1\u00a1\1\uffff\1\u00a0",
+            "\1\u00a7\3\uffff\1\u00a8\3\uffff\1\u00a9\5\uffff\1\u00a6\4"+
+            "\uffff\1\u00aa",
+            "\1\u00ad\3\uffff\1\u00ab\3\uffff\1\u00ac",
+            "\1\u00b0\2\uffff\1\u00af\1\u00b3\6\uffff\1\u00ae\2\uffff\1"+
+            "\u00b2\2\uffff\1\u00b1",
+            "\1\u00b4",
+            "\1\u00b9\12\uffff\1\u00b6\2\uffff\1\u00b5\2\uffff\1\u00b7"+
+            "\2\uffff\1\u00b8",
+            "\1\u00ba",
+            "\1\u00bb",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00c6",
+            "\12\u00c9\10\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1\u00cb"+
+            "\13\uffff\1\u00c8\6\uffff\1\u00c9\2\uffff\1\u00cb\1\uffff\3"+
+            "\u00cb\5\uffff\1\u00cb\13\uffff\1\u00c8",
+            "\12\u00c9\10\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1\u00cb"+
+            "\22\uffff\1\u00c9\2\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1"+
+            "\u00cb",
+            "\1\141\34\uffff\32\141\4\uffff\1\141\1\uffff\32\141",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00ce",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00d0",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00d2",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00d4\5\uffff\1\u00d5",
+            "\1\u00d6",
+            "",
+            "\1\u00d7",
+            "\1\u00d8",
+            "\1\u00d9",
+            "\1\u00da",
+            "\1\u00db",
+            "\1\u00dc\15\uffff\1\u00dd",
+            "\1\u00de",
+            "\1\u00e0\11\uffff\1\u00df",
+            "\1\u00e2\14\uffff\1\u00e3\5\uffff\1\u00e1",
+            "\1\u00e4",
+            "\1\u00e5",
+            "\1\u00e7\16\uffff\1\u00e6",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\4\141\1\u00e8\25\141",
+            "\1\u00eb\13\uffff\1\u00ea",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\10\141\1\u00ec\11\141\1\u00ef\1\u00ed\1\141\1\u00ee\4\141",
+            "\1\u00f1",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u00f3",
+            "\1\u00f5\10\uffff\1\u00f6\11\uffff\1\u00f4",
+            "\1\u00f7",
+            "\1\u00f8",
+            "\1\u00f9",
+            "\1\u00fa",
+            "\1\u00fb",
+            "\1\u00fc",
+            "\1\u00fd",
+            "\1\u00fe",
+            "\1\u00ff",
+            "\1\u0100",
+            "\1\u0101",
+            "\1\u0103\7\uffff\1\u0102\13\uffff\1\u0105\3\uffff\1\u0104",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0107",
+            "\1\u0108",
+            "\1\u0109",
+            "\1\u010a",
+            "\1\u010b",
+            "\1\u010c",
+            "\1\u010d",
+            "\1\u010e",
+            "\1\u010f",
+            "\1\u0110",
+            "\1\u0112\5\uffff\1\u0111",
+            "\1\u0113\11\uffff\1\u0114\5\uffff\1\u0115",
+            "\1\u0116",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\22\141\1\u0117\7\141",
+            "\1\u0119",
+            "\1\u011a",
+            "\1\u011b",
+            "\1\u011c\3\uffff\1\u011d",
+            "\1\u011e",
+            "\1\u011f",
+            "\1\u0120",
+            "\1\u0122\5\uffff\1\u0121",
+            "\1\u0123",
+            "\1\u0124",
+            "\1\u0125",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\2\141\1\u0126\1\u0127\26\141",
+            "\1\u0129",
+            "\1\u012b\5\uffff\1\u012d\6\uffff\1\u012c\1\uffff\1\u012a",
+            "\1\u012e",
+            "\1\u012f",
+            "\1\u0130",
+            "\1\u0131",
+            "\1\u0132",
+            "\1\u0133",
+            "\1\u0135\20\uffff\1\u0134",
+            "\1\u0136",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\26\141\1\u0137\3\141",
+            "\1\u0139",
+            "\1\u013d\5\uffff\1\u013c\6\uffff\1\u013a\2\uffff\1\u013b",
+            "\1\u013e",
+            "\1\u013f",
+            "\1\u0140",
+            "\1\u0141",
+            "\1\u0142",
+            "\1\u0143",
+            "\1\u0144",
+            "\1\u0145\25\uffff\1\u0146",
+            "\1\u0147",
+            "\1\u0148\1\u0149",
+            "\1\u014a",
+            "\1\u014b",
+            "\1\u014c\7\uffff\1\u014e\1\uffff\1\u014d",
+            "\1\u014f",
+            "\1\u0150",
+            "\1\u0151",
+            "\1\u0152\2\uffff\1\u0153\1\u0154",
+            "\1\u0156\5\uffff\1\u0155",
+            "\1\u0157",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\u00c9\10\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1\u00cb"+
+            "\22\uffff\1\u00c9\2\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1"+
+            "\u00cb",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u015a",
+            "\1\u015b",
+            "\1\u015c",
+            "\1\u015e\6\uffff\1\u015d",
+            "\1\u015f",
+            "\1\u0160",
+            "\1\u0161",
+            "\1\u0162",
+            "\1\u0163",
+            "\1\u0164",
+            "\1\u0165",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0167",
+            "\1\u0168",
+            "\1\u0169",
+            "\1\u016a",
+            "\1\u016b",
+            "\1\u016c",
+            "\1\u016d",
+            "",
+            "\1\u016e",
+            "\1\u016f",
+            "\1\u0170",
+            "\1\u0171",
+            "\1\u0172",
+            "\1\u0173",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u0175",
+            "\1\u0176",
+            "\1\u0177",
+            "\1\u0178",
+            "\1\u0179",
+            "\1\u017a",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u017c",
+            "\1\u017d",
+            "\1\u017e",
+            "\1\u017f",
+            "\1\u0180",
+            "\1\u0181",
+            "\1\u0182",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\1\141\1\u0183\15\141\1\u0185\2\141\1\u0184\7\141",
+            "\1\u0187",
+            "\1\u0189\12\uffff\1\u0188",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u018b",
+            "",
+            "\1\u018c",
+            "\1\u018d",
+            "\1\u018e",
+            "\1\141\13\uffff\12\141\7\uffff\1\141\1\u0192\6\141\1\u018f"+
+            "\4\141\1\u0190\4\141\1\u0193\1\u0194\1\u0191\5\141\4\uffff\1"+
+            "\141\1\uffff\32\141",
+            "\1\u0196",
+            "\1\u0197",
+            "\1\u0198",
+            "\1\u0199",
+            "\1\u019a",
+            "\1\u019b",
+            "\1\u019c",
+            "\1\u019d",
+            "\1\u019e",
+            "\1\u019f",
+            "\1\u01a0",
+            "\1\u01a1",
+            "\1\u01a2",
+            "",
+            "\1\u01a3",
+            "\1\u01a4",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u01a6",
+            "\1\u01a7",
+            "\1\u01a8",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u01aa",
+            "\1\u01ab",
+            "\1\u01ac",
+            "\1\u01ad",
+            "\1\u01ae",
+            "\1\u01af",
+            "\1\u01b0\1\u01b1\1\uffff\1\u01b3\1\u01b2",
+            "\1\u01b4",
+            "",
+            "\1\u01b5",
+            "\1\u01b6",
+            "\1\u01b7",
+            "\1\u01b8\2\uffff\1\u01b9",
+            "\1\u01ba",
+            "\1\u01bb",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u01bd",
+            "\1\u01be",
+            "\1\u01bf",
+            "\1\u01c0\3\uffff\1\u01c1",
+            "\1\u01c2",
+            "\1\u01c3",
+            "\1\u01c4",
+            "\1\u01c5",
+            "",
+            "\1\u01c6",
+            "\1\u01c8\20\uffff\1\u01c7",
+            "\1\u01c9",
+            "\1\u01ca",
+            "\1\u01cb",
+            "\1\u01cc",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u01ce",
+            "\1\u01cf",
+            "\1\u01d0",
+            "\1\u01d1",
+            "\1\u01d2",
+            "\1\u01d3",
+            "\1\u01d4",
+            "\1\u01d5",
+            "\1\u01d6",
+            "\1\u01d7",
+            "\1\u01d8",
+            "\1\u01da\6\uffff\1\u01d9",
+            "\1\u01db",
+            "\1\u01dd\15\uffff\1\u01dc",
+            "\1\u01de",
+            "\1\u01df",
+            "\1\u01e0",
+            "\1\u01e1",
+            "\1\u01e2",
+            "\1\u01e4\2\uffff\1\u01e3",
+            "\1\u01e5",
+            "\1\u01e6",
+            "\1\u01e7",
+            "\1\u01e8",
+            "",
+            "",
+            "\1\u01e9",
+            "\1\u01ea",
+            "\1\u01eb",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\u01ec\1\uffff"+
+            "\32\141",
+            "\1\u01ef\1\u01ee",
+            "\1\u01f0",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u01f3\3\uffff\1\u01f2",
+            "\1\u01f4",
+            "\1\u01f5",
+            "\1\u01f6",
+            "\1\u01f7",
+            "",
+            "\1\u01f8",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u01fa",
+            "\1\u01fb",
+            "\1\u01fc",
+            "\1\u01fd",
+            "\1\u01fe",
+            "\1\u01ff",
+            "\1\u0200",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\10\141\1\u0201\21\141",
+            "\1\u0203",
+            "\1\u0204",
+            "\1\u0205",
+            "",
+            "\1\u0206",
+            "\1\u0207",
+            "\1\u0208",
+            "\1\u0209",
+            "\1\u020a",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u020c",
+            "\1\u020d",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u020f",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0211",
+            "\1\u0212",
+            "\1\u0213",
+            "\1\u0214",
+            "\1\u0215",
+            "",
+            "\1\u0216",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0218",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\16\141\1\u021b\13\141",
+            "\1\u021d",
+            "\1\u021e",
+            "\1\u021f",
+            "\1\u0220",
+            "\1\u0221",
+            "\1\u0222",
+            "\1\u0223",
+            "",
+            "\1\u0224",
+            "\1\u0225",
+            "\1\u0226",
+            "\1\u0227",
+            "\1\u0228",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u022a",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u022c",
+            "\1\u022d",
+            "\1\141\13\uffff\12\141\7\uffff\17\141\1\u022e\12\141\4\uffff"+
+            "\1\141\1\uffff\32\141",
+            "\1\u0230",
+            "\1\u0231",
+            "\1\u0232",
+            "\1\u0233",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0235",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0238",
+            "\1\u0239",
+            "\1\u023a",
+            "\1\u023b",
+            "\1\u023c",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\u023d\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0240",
+            "\1\u0241\1\u0242\1\u0243\1\u0244\1\u0245",
+            "\1\u0246",
+            "\1\u0247",
+            "\1\u0248",
+            "\1\u0249",
+            "\1\u024a",
+            "\1\u024b",
+            "\1\u024c",
+            "\1\u024d",
+            "",
+            "\1\u024e",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0251",
+            "\1\u0252",
+            "\1\u0253",
+            "\1\u0254",
+            "\1\u0255",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\17\141\1\u0258\12\141\4\uffff"+
+            "\1\141\1\uffff\14\141\1\u0257\15\141",
+            "\1\u025a",
+            "\1\u025b",
+            "\1\u025c",
+            "\1\u025d",
+            "\1\u025e",
+            "\1\u025f",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0261",
+            "\1\u0262",
+            "\1\u0263",
+            "\1\u0264",
+            "\1\u0265",
+            "\1\u0266",
+            "\1\u0267",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0269",
+            "\1\u026a",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u026c",
+            "\1\u0270\1\uffff\1\u026e\5\uffff\1\u026f\47\uffff\1\u026d",
+            "\1\u0271",
+            "\1\u0272",
+            "\1\u0273",
+            "\1\u0274",
+            "\1\u0275",
+            "\1\u0276",
+            "\1\u0277",
+            "\1\u0278",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u027a",
+            "\1\u027b",
+            "\1\u027c",
+            "\1\u027d",
+            "\1\u027e",
+            "\1\u027f\16\uffff\1\u0280",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0282",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\u0283\1\uffff"+
+            "\32\141",
+            "\1\u0285",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\22\141\1\u0286\7\141",
+            "",
+            "\1\u0288",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\14\141\1\u0289\5\141\1\u028a\7\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u028e",
+            "\1\u028f",
+            "\1\u0290",
+            "",
+            "\1\u0291",
+            "\1\u0292",
+            "\1\u0293",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0295",
+            "\1\u0296",
+            "\1\u0297",
+            "\1\u0298",
+            "",
+            "\1\u0299",
+            "\1\u029a",
+            "\1\u029b",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\22\141\1\u029e\7\141",
+            "\1\u02a0",
+            "\1\u02a1",
+            "",
+            "\1\u02a2",
+            "\1\u02a3",
+            "",
+            "\1\u02a4",
+            "",
+            "\1\u02a5",
+            "\1\u02a6",
+            "\1\u02a7",
+            "\1\u02a8",
+            "\1\u02a9",
+            "\1\u02aa",
+            "",
+            "\1\u02ab\2\uffff\1\u02ac",
+            "",
+            "",
+            "\1\u02ad",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u02af",
+            "\1\u02b0",
+            "\1\u02b1",
+            "\1\u02b2",
+            "\1\u02b3\14\uffff\1\u02b4",
+            "\1\u02b5",
+            "\1\u02b6",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\22\141\1\u02b7\7\141",
+            "\1\u02b9",
+            "\1\u02ba",
+            "\1\u02bb",
+            "",
+            "\1\u02bc",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u02be",
+            "\1\u02bf",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u02c1",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u02c3",
+            "",
+            "\1\u02c4",
+            "",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\21\141\1\u02c7\10\141\4\uffff"+
+            "\1\141\1\uffff\21\141\1\u02c6\10\141",
+            "\1\u02c9",
+            "\1\u02ca",
+            "\1\u02cb",
+            "\1\u02cc",
+            "",
+            "",
+            "\1\u02cd",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u02d3",
+            "\1\u02d4",
+            "\1\u02d5",
+            "\1\u02d6",
+            "\1\u02d7",
+            "\1\u02d8",
+            "\1\u02d9",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "",
+            "\1\u02dc",
+            "\1\u02dd",
+            "\1\u02de",
+            "\1\u02df",
+            "\1\u02e0",
+            "",
+            "\1\u02e1",
+            "\1\u02e2",
+            "",
+            "\1\u02e3",
+            "\1\u02e4",
+            "\1\u02e5",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u02e7",
+            "\1\u02e8",
+            "",
+            "\1\u02e9",
+            "\1\u02ea",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u02ec",
+            "\1\u02ed",
+            "\1\u02ee",
+            "\1\u02ef\1\u02f0\12\uffff\1\u02f1\3\uffff\1\u02f2",
+            "",
+            "\1\u02f3",
+            "\1\u02f4",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u02f6",
+            "\1\u02f7",
+            "\1\u02f8",
+            "\1\u02f9",
+            "\1\u02fa",
+            "\1\u02fb",
+            "\1\u02fc",
+            "\1\141\13\uffff\12\141\7\uffff\3\141\1\u02fd\26\141\4\uffff"+
+            "\1\141\1\uffff\32\141",
+            "\1\u02ff",
+            "\1\u0300",
+            "\1\u0301",
+            "\1\u0302",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0304",
+            "\1\u0305",
+            "\1\u0306",
+            "\1\u0307",
+            "\1\u0308",
+            "\1\u0309",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u030b",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u030f",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0312",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0315",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u0317",
+            "\1\u0318",
+            "\1\u0319",
+            "\1\u031a",
+            "\1\u031b",
+            "\1\u031c",
+            "\1\u031d",
+            "",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u031f",
+            "\1\u0320",
+            "\1\u0321",
+            "\1\u0322",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0325",
+            "\1\u0326",
+            "\1\u0327",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0329",
+            "\1\u032a",
+            "\1\u032b",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u032d",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u032f",
+            "\1\u0330",
+            "\1\u0331",
+            "\1\u0332",
+            "\1\u0333",
+            "\1\u0334",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u0336",
+            "\1\u0337",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0339",
+            "",
+            "\1\u033a\16\uffff\1\u033b",
+            "\1\u033c",
+            "",
+            "\1\u033d",
+            "",
+            "\1\u033e",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u0340",
+            "\1\u0341",
+            "",
+            "\1\u0342",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0344",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0347",
+            "\1\u0348",
+            "\1\u0349",
+            "\1\u034a",
+            "\1\u034b",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "",
+            "\1\u034e",
+            "\1\u034f",
+            "\1\u0350",
+            "\1\u0351",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0353",
+            "\1\u0354",
+            "\1\u0355",
+            "\1\u0357\15\uffff\1\u0356",
+            "\1\u0358",
+            "",
+            "\1\u0359",
+            "\1\u035a",
+            "\1\u035b",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u035e",
+            "\1\u035f",
+            "\1\u0360\7\uffff\1\u0361",
+            "\1\u0362",
+            "\1\u0363",
+            "\1\u0364",
+            "\1\u0365",
+            "\1\u0366",
+            "",
+            "\1\u0367",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u036a",
+            "\1\u036b",
+            "\1\u036c",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u036e",
+            "",
+            "\1\u036f",
+            "\1\u0370",
+            "\1\u0371",
+            "\1\u0372",
+            "",
+            "\1\u0373",
+            "\1\u0374",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0378",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "",
+            "",
+            "\1\u037a",
+            "",
+            "",
+            "\1\u037b",
+            "",
+            "",
+            "\1\u037c",
+            "",
+            "\1\u037d",
+            "\1\u037e",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0381\15\uffff\1\u0380",
+            "\1\u0382",
+            "\1\u0383",
+            "\1\u0384",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0386",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "",
+            "\1\u0389",
+            "\1\u038a",
+            "\1\u038b",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\22\141\1\u038c\7\141",
+            "\1\u038e",
+            "\1\u038f",
+            "",
+            "\1\u0390",
+            "",
+            "\1\u0391\3\uffff\1\u0394\10\uffff\1\u0392\1\uffff\1\u0393",
+            "\1\u0395",
+            "\1\u0396",
+            "\1\u0397",
+            "\1\u0398",
+            "\1\u0399",
+            "",
+            "\1\u039a",
+            "\1\u039b",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u039d",
+            "\1\u039e",
+            "\1\u039f",
+            "\1\u03a0",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u03a2",
+            "\1\u03a3",
+            "\1\u03a4",
+            "",
+            "\1\u03a5",
+            "",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u03a9",
+            "\1\u03aa",
+            "",
+            "",
+            "\1\u03ab",
+            "\1\u03ac",
+            "\1\u03ad",
+            "\1\u03ae",
+            "",
+            "\1\u03af",
+            "\1\u03b0",
+            "\1\u03b1",
+            "\1\u03b2",
+            "\1\u03b3",
+            "\1\u03b4",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u03b6\21\uffff\1\u03b7",
+            "\1\u03b8",
+            "",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\1\u03bc\1\141\1\u03bb\13\141"+
+            "\1\u03ba\2\141\1\u03bd\10\141\4\uffff\1\141\1\uffff\32\141",
+            "\1\u03bf",
+            "\1\u03c0",
+            "\1\u03c1",
+            "\1\u03c2",
+            "\1\u03c3",
+            "\1\u03c4",
+            "\1\u03c5",
+            "\1\u03c6",
+            "",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\u03c7\1\uffff"+
+            "\32\141",
+            "\1\u03c9",
+            "\1\u03ca",
+            "",
+            "\1\u03cb",
+            "\1\u03cc",
+            "\1\u03cd",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u03cf",
+            "\1\u03d0",
+            "\1\u03d1\13\uffff\1\u03d2\1\uffff\1\u03d3\1\u03d4",
+            "",
+            "",
+            "",
+            "\1\u03d5",
+            "",
+            "\1\u03d6",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\21\141\1\u03d7\10\141",
+            "\1\u03d9",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u03db",
+            "",
+            "\1\u03dc",
+            "\1\u03dd",
+            "\1\u03de",
+            "\1\u03df",
+            "\1\u03e0",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\6\141\1\u03e1\23\141",
+            "",
+            "",
+            "\1\u03e3",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u03e5",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u03e7",
+            "\1\u03e8",
+            "\1\u03e9",
+            "\1\u03ea",
+            "\1\u03eb",
+            "\1\u03ec\15\uffff\1\u03ed\2\uffff\1\u03ee",
+            "\1\u03ef",
+            "\1\u03f0",
+            "\1\u03f1",
+            "\1\u03f2",
+            "\1\u03f3",
+            "\1\u03f4",
+            "\1\u03f5",
+            "\1\u03f6",
+            "",
+            "\1\u03f7",
+            "\1\u03f8",
+            "\1\u03f9",
+            "\1\u03fa",
+            "",
+            "\1\u03fb",
+            "\1\u03fc",
+            "\1\u03fd",
+            "\1\u03fe",
+            "",
+            "",
+            "",
+            "\1\u03ff",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0401",
+            "\1\u0402",
+            "\1\u0403",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0405",
+            "\1\u0406",
+            "\1\u0407",
+            "\1\u0408",
+            "\1\u0409",
+            "\1\u040a",
+            "",
+            "\1\u040b",
+            "\1\u040c",
+            "\1\u040d",
+            "",
+            "\1\u040e",
+            "\1\u040f",
+            "\1\u0410\21\uffff\1\u0411",
+            "\1\u0412",
+            "",
+            "\1\u0413",
+            "\1\u0414",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0416",
+            "\1\u0417",
+            "\1\u0418",
+            "\1\u0419",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u041b",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u041d",
+            "\1\u041e",
+            "\1\u041f",
+            "\1\u0420",
+            "",
+            "\1\u0421",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0423",
+            "\1\u0424",
+            "\1\u0425",
+            "\1\u0426",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0428",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u042a",
+            "",
+            "\1\u042b",
+            "\1\u042c",
+            "\1\u042d",
+            "\1\u042e",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0430",
+            "\1\u0431",
+            "",
+            "\1\u0432",
+            "",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u0434",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0436",
+            "\1\u0437",
+            "\1\u0438",
+            "\1\u0439",
+            "\1\u043a",
+            "\1\u043b",
+            "\1\u043c",
+            "\1\u043d",
+            "\1\u043e",
+            "\1\u043f",
+            "\1\u0440",
+            "\1\u0441",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0444",
+            "\1\u0445",
+            "\1\u0446",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u0448",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u044a",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\u044c",
+            "",
+            "\1\u044d",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "\1\141\13\uffff\12\141\7\uffff\32\141\4\uffff\1\141\1\uffff"+
+            "\32\141",
+            "",
+            "\1\u0450",
+            "\1\u0451",
+            "\1\u0452",
+            "\1\u0453",
+            "\1\u0454",
+            "\1\u0455",
+            "\1\u0456",
+            "\1\u0457",
+            "\1\u0458",
+            "\1\u0459",
+            "\1\u045a",
+            "\1\u045b",
+            "\1\u045c",
+            "\1\u045e\13\uffff\1\u045f\2\uffff\1\u045d",
+            "\1\u0460",
+            "\1\u0461",
+            "",
+            "\1\u0462",
+            "\1\u0463",
+            "\1\u0464",
+            "\1\u0465",
+            "",
+            "\1\u0466",
+            "",
+            "\1\u0467",
+            "\1\u0468",
+            "\1\u0469",
+            "\1\u046a",
+            "\1\u046b",
+            "",
+            "\1\u046c",
+            "\1\u046d",
+            "\1\u046e",
+            "\1\u046f",
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSLParser.java b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSLParser.java
new file mode 100644
index 0000000..ed973f2
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSLParser.java
@@ -0,0 +1,10014 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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.statemachine.services.StatemachineDSLGrammarAccess;
+
+
+
+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")
+interface InternalStatemachineDSLParserSignatures {
+     void entryRuleStatemachineModel() throws RecognitionException;
+     void ruleStatemachineModel() throws RecognitionException;
+     void entryRuleStatemachinePackage() throws RecognitionException;
+     void ruleStatemachinePackage() throws RecognitionException;
+     void entryRuleStatemachine() throws RecognitionException;
+     void ruleStatemachine() throws RecognitionException;
+     void entryRuleStatemachineEvent() throws RecognitionException;
+     void ruleStatemachineEvent() throws RecognitionException;
+     void entryRuleStatemachineState() throws RecognitionException;
+     void ruleStatemachineState() throws RecognitionException;
+     void entryRuleStatemachineTrigger() throws RecognitionException;
+     void ruleStatemachineTrigger() throws RecognitionException;
+     void entryRuleStatemachineAction() throws RecognitionException;
+     void ruleStatemachineAction() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralBlinkRate() throws RecognitionException;
+     void ruleStatemachineActionPeripheralBlinkRate() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralClear() throws RecognitionException;
+     void ruleStatemachineActionPeripheralClear() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralCreateWindow() throws RecognitionException;
+     void ruleStatemachineActionPeripheralCreateWindow() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralCursorType() throws RecognitionException;
+     void ruleStatemachineActionPeripheralCursorType() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralDestroyWindow() throws RecognitionException;
+     void ruleStatemachineActionPeripheralDestroyWindow() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralDeviceBrightness() throws RecognitionException;
+     void ruleStatemachineActionPeripheralDeviceBrightness() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralDisplayBitmap() throws RecognitionException;
+     void ruleStatemachineActionPeripheralDisplayBitmap() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralDisplayText() throws RecognitionException;
+     void ruleStatemachineActionPeripheralDisplayText() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralDisplayTextAt() throws RecognitionException;
+     void ruleStatemachineActionPeripheralDisplayTextAt() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralInterCharacterWait() throws RecognitionException;
+     void ruleStatemachineActionPeripheralInterCharacterWait() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralMarqueeFormat() throws RecognitionException;
+     void ruleStatemachineActionPeripheralMarqueeFormat() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralMarqueeRepeatWait() throws RecognitionException;
+     void ruleStatemachineActionPeripheralMarqueeRepeatWait() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralMarqueeType() throws RecognitionException;
+     void ruleStatemachineActionPeripheralMarqueeType() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralMarqueeUnitWait() throws RecognitionException;
+     void ruleStatemachineActionPeripheralMarqueeUnitWait() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralScroll() throws RecognitionException;
+     void ruleStatemachineActionPeripheralScroll() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralOpenDrawer() throws RecognitionException;
+     void ruleStatemachineActionPeripheralOpenDrawer() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPrintBarcode() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPrintBarcode() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPrintBitmap() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPrintBitmap() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPrintCut() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPrintCut() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPrintNormal() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPrintNormal() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPrintRegisterBitmap() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPrintRegisterBitmap() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPTOpen() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPTOpen() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPTClose() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPTClose() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPTAcknowledge() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPTAcknowledge() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPTReversal() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPTReversal() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPTRegistration() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPTRegistration() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPTAuthorization() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPTAuthorization() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPTResponse() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPTResponse() throws RecognitionException;
+     void entryRuleStatemachineActionPeripheralPrintReport() throws RecognitionException;
+     void ruleStatemachineActionPeripheralPrintReport() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSource() throws RecognitionException;
+     void ruleStatemachineActionFieldSource() throws RecognitionException;
+     void entryRuleStatemachineOperation() throws RecognitionException;
+     void ruleStatemachineOperation() throws RecognitionException;
+     void entryRuleStatemachineGuard() throws RecognitionException;
+     void ruleStatemachineGuard() throws RecognitionException;
+     void entryRuleStatemachineFunction() throws RecognitionException;
+     void ruleStatemachineFunction() throws RecognitionException;
+     void entryRuleStatemachineStorage() throws RecognitionException;
+     void ruleStatemachineStorage() throws RecognitionException;
+     void entryRuleStatemachineStorageRetrieve() throws RecognitionException;
+     void ruleStatemachineStorageRetrieve() throws RecognitionException;
+     void entryRuleStatemachineActionConditionalTransition() throws RecognitionException;
+     void ruleStatemachineActionConditionalTransition() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceString() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceString() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceNumber() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceNumber() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceEvaluate() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceEvaluate() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceEvent() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceEvent() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceTranslate() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceTranslate() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceDtoAttribute() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceDtoAttribute() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceMore() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceMore() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceStringMore() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceStringMore() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceNumberMore() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceNumberMore() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceEvaluateMore() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceEvaluateMore() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceTranslateMore() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceTranslateMore() throws RecognitionException;
+     void entryRuleStatemachineActionFieldGetMore() throws RecognitionException;
+     void ruleStatemachineActionFieldGetMore() throws RecognitionException;
+     void entryRuleStatemachineOperationMore() throws RecognitionException;
+     void ruleStatemachineOperationMore() throws RecognitionException;
+     void entryRuleStatemachineStorageRetrieveMore() throws RecognitionException;
+     void ruleStatemachineStorageRetrieveMore() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSourceDtoAttributeMore() throws RecognitionException;
+     void ruleStatemachineActionFieldSourceDtoAttributeMore() throws RecognitionException;
+     void entryRuleStatemachineActionFieldConcatenation() throws RecognitionException;
+     void ruleStatemachineActionFieldConcatenation() throws RecognitionException;
+     void entryRuleStatemachineOperationParameter() throws RecognitionException;
+     void ruleStatemachineOperationParameter() throws RecognitionException;
+     void entryRuleStatemachineOperationParameterMore() throws RecognitionException;
+     void ruleStatemachineOperationParameterMore() throws RecognitionException;
+     void entryRuleStatemachineActionFieldSet() throws RecognitionException;
+     void ruleStatemachineActionFieldSet() throws RecognitionException;
+     void entryRuleStatemachineActionFieldClear() throws RecognitionException;
+     void ruleStatemachineActionFieldClear() throws RecognitionException;
+     void entryRuleStatemachineActionFieldGet() throws RecognitionException;
+     void ruleStatemachineActionFieldGet() throws RecognitionException;
+     void entryRuleStatemachineActionFieldRemove() throws RecognitionException;
+     void ruleStatemachineActionFieldRemove() throws RecognitionException;
+     void entryRuleStatemachineActionItemVisible() throws RecognitionException;
+     void ruleStatemachineActionItemVisible() throws RecognitionException;
+     void entryRuleStatemachineActionItemInvisible() throws RecognitionException;
+     void ruleStatemachineActionItemInvisible() throws RecognitionException;
+     void entryRuleStatemachineActionButtonCaption() throws RecognitionException;
+     void ruleStatemachineActionButtonCaption() throws RecognitionException;
+     void entryRuleStatemachineActionButtonImage() throws RecognitionException;
+     void ruleStatemachineActionButtonImage() throws RecognitionException;
+     void entryRuleStatemachineActionDTOFind() throws RecognitionException;
+     void ruleStatemachineActionDTOFind() throws RecognitionException;
+     void entryRuleStatemachineActionScheduler() throws RecognitionException;
+     void ruleStatemachineActionScheduler() throws RecognitionException;
+     void entryRuleStatemachineControl() throws RecognitionException;
+     void ruleStatemachineControl() throws RecognitionException;
+     void entryRuleStatemachineControlButton() throws RecognitionException;
+     void ruleStatemachineControlButton() throws RecognitionException;
+     void entryRuleStatemachineControlField() throws RecognitionException;
+     void ruleStatemachineControlField() throws RecognitionException;
+     void entryRuleStatemachineControlDTO() throws RecognitionException;
+     void ruleStatemachineControlDTO() throws RecognitionException;
+     void entryRuleStatemachineControlScheduler() throws RecognitionException;
+     void ruleStatemachineControlScheduler() throws RecognitionException;
+     void entryRuleStatemachinePeripheralDeviceLineDisplay() throws RecognitionException;
+     void ruleStatemachinePeripheralDeviceLineDisplay() throws RecognitionException;
+     void entryRuleStatemachinePeripheralDevicePOSPrinter() throws RecognitionException;
+     void ruleStatemachinePeripheralDevicePOSPrinter() throws RecognitionException;
+     void entryRuleStatemachinePeripheralDeviceCashDrawer() throws RecognitionException;
+     void ruleStatemachinePeripheralDeviceCashDrawer() throws RecognitionException;
+     void entryRuleStatemachinePeripheralDevicePT() throws RecognitionException;
+     void ruleStatemachinePeripheralDevicePT() throws RecognitionException;
+     void entryRuleStatemachineControlPeripheral() throws RecognitionException;
+     void ruleStatemachineControlPeripheral() throws RecognitionException;
+     void entryRuleStatemachineControlButtonAttribute() throws RecognitionException;
+     void ruleStatemachineControlButtonAttribute() throws RecognitionException;
+     void entryRuleStatemachineControlButtonAttributeEvent() throws RecognitionException;
+     void ruleStatemachineControlButtonAttributeEvent() throws RecognitionException;
+     void entryRuleStatemachineControlButtonAttributeEventKeyboard() throws RecognitionException;
+     void ruleStatemachineControlButtonAttributeEventKeyboard() throws RecognitionException;
+     void entryRuleStatemachineControlButtonAttributeEventIdentity() throws RecognitionException;
+     void ruleStatemachineControlButtonAttributeEventIdentity() throws RecognitionException;
+     void entryRuleStatemachineControlButtonAttributeEventEvent() throws RecognitionException;
+     void ruleStatemachineControlButtonAttributeEventEvent() throws RecognitionException;
+     void entryRuleStatemachineControlFieldAttribute() throws RecognitionException;
+     void ruleStatemachineControlFieldAttribute() throws RecognitionException;
+     void entryRuleStatemachineControlFieldLayout() throws RecognitionException;
+     void ruleStatemachineControlFieldLayout() throws RecognitionException;
+     void entryRuleStatemachineControlDTOAttribute() throws RecognitionException;
+     void ruleStatemachineControlDTOAttribute() throws RecognitionException;
+     void entryRuleStatemachineControlSchedulerAttribute() throws RecognitionException;
+     void ruleStatemachineControlSchedulerAttribute() throws RecognitionException;
+     void entryRuleStatemachineDTOType() throws RecognitionException;
+     void ruleStatemachineDTOType() throws RecognitionException;
+     void entryRuleStatemachineFieldType() throws RecognitionException;
+     void ruleStatemachineFieldType() throws RecognitionException;
+     void entryRuleStatemachineImport() throws RecognitionException;
+     void ruleStatemachineImport() throws RecognitionException;
+     void entryRuleStatemachineQualifiedNameWithWildCard() throws RecognitionException;
+     void ruleStatemachineQualifiedNameWithWildCard() throws RecognitionException;
+     void entryRuleQualifiedName() throws RecognitionException;
+     void ruleQualifiedName() throws RecognitionException;
+     void entryRuleValidID() throws RecognitionException;
+     void ruleValidID() throws RecognitionException;
+     void entryRuleTRANSLATABLESTRING() throws RecognitionException;
+     void ruleTRANSLATABLESTRING() throws RecognitionException;
+     void entryRuleTRANSLATABLEID() throws RecognitionException;
+     void ruleTRANSLATABLEID() throws RecognitionException;
+     void entryRuleSignedNumber() throws RecognitionException;
+     void ruleSignedNumber() throws RecognitionException;
+     void entryRuleUnsignedNumber() throws RecognitionException;
+     void ruleUnsignedNumber() throws RecognitionException;
+     void entryRuleXAnnotation() throws RecognitionException;
+     void ruleXAnnotation() throws RecognitionException;
+     void entryRuleXAnnotationElementValuePair() throws RecognitionException;
+     void ruleXAnnotationElementValuePair() throws RecognitionException;
+     void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException;
+     void ruleXAnnotationElementValueOrCommaList() throws RecognitionException;
+     void entryRuleXAnnotationElementValue() throws RecognitionException;
+     void ruleXAnnotationElementValue() throws RecognitionException;
+     void entryRuleXAnnotationOrExpression() throws RecognitionException;
+     void ruleXAnnotationOrExpression() throws RecognitionException;
+     void entryRuleXExpression() throws RecognitionException;
+     void ruleXExpression() throws RecognitionException;
+     void entryRuleXAssignment() throws RecognitionException;
+     void ruleXAssignment() throws RecognitionException;
+     void entryRuleOpSingleAssign() throws RecognitionException;
+     void ruleOpSingleAssign() throws RecognitionException;
+     void entryRuleOpMultiAssign() throws RecognitionException;
+     void ruleOpMultiAssign() throws RecognitionException;
+     void entryRuleXOrExpression() throws RecognitionException;
+     void ruleXOrExpression() throws RecognitionException;
+     void entryRuleOpOr() throws RecognitionException;
+     void ruleOpOr() throws RecognitionException;
+     void entryRuleXAndExpression() throws RecognitionException;
+     void ruleXAndExpression() throws RecognitionException;
+     void entryRuleOpAnd() throws RecognitionException;
+     void ruleOpAnd() throws RecognitionException;
+     void entryRuleXEqualityExpression() throws RecognitionException;
+     void ruleXEqualityExpression() throws RecognitionException;
+     void entryRuleOpEquality() throws RecognitionException;
+     void ruleOpEquality() throws RecognitionException;
+     void entryRuleXRelationalExpression() throws RecognitionException;
+     void ruleXRelationalExpression() throws RecognitionException;
+     void entryRuleOpCompare() throws RecognitionException;
+     void ruleOpCompare() throws RecognitionException;
+     void entryRuleXOtherOperatorExpression() throws RecognitionException;
+     void ruleXOtherOperatorExpression() throws RecognitionException;
+     void entryRuleOpOther() throws RecognitionException;
+     void ruleOpOther() throws RecognitionException;
+     void entryRuleXAdditiveExpression() throws RecognitionException;
+     void ruleXAdditiveExpression() throws RecognitionException;
+     void entryRuleOpAdd() throws RecognitionException;
+     void ruleOpAdd() throws RecognitionException;
+     void entryRuleXMultiplicativeExpression() throws RecognitionException;
+     void ruleXMultiplicativeExpression() throws RecognitionException;
+     void entryRuleOpMulti() throws RecognitionException;
+     void ruleOpMulti() throws RecognitionException;
+     void entryRuleXUnaryOperation() throws RecognitionException;
+     void ruleXUnaryOperation() throws RecognitionException;
+     void entryRuleOpUnary() throws RecognitionException;
+     void ruleOpUnary() throws RecognitionException;
+     void entryRuleXCastedExpression() throws RecognitionException;
+     void ruleXCastedExpression() throws RecognitionException;
+     void entryRuleXPostfixOperation() throws RecognitionException;
+     void ruleXPostfixOperation() throws RecognitionException;
+     void entryRuleOpPostfix() throws RecognitionException;
+     void ruleOpPostfix() throws RecognitionException;
+     void entryRuleXMemberFeatureCall() throws RecognitionException;
+     void ruleXMemberFeatureCall() throws RecognitionException;
+     void entryRuleXPrimaryExpression() throws RecognitionException;
+     void ruleXPrimaryExpression() throws RecognitionException;
+     void entryRuleXLiteral() throws RecognitionException;
+     void ruleXLiteral() throws RecognitionException;
+     void entryRuleXCollectionLiteral() throws RecognitionException;
+     void ruleXCollectionLiteral() throws RecognitionException;
+     void entryRuleXSetLiteral() throws RecognitionException;
+     void ruleXSetLiteral() throws RecognitionException;
+     void entryRuleXListLiteral() throws RecognitionException;
+     void ruleXListLiteral() throws RecognitionException;
+     void entryRuleXClosure() throws RecognitionException;
+     void ruleXClosure() throws RecognitionException;
+     void entryRuleXExpressionInClosure() throws RecognitionException;
+     void ruleXExpressionInClosure() throws RecognitionException;
+     void entryRuleXShortClosure() throws RecognitionException;
+     void ruleXShortClosure() throws RecognitionException;
+     void entryRuleXParenthesizedExpression() throws RecognitionException;
+     void ruleXParenthesizedExpression() throws RecognitionException;
+     void entryRuleXIfExpression() throws RecognitionException;
+     void ruleXIfExpression() throws RecognitionException;
+     void entryRuleXSwitchExpression() throws RecognitionException;
+     void ruleXSwitchExpression() throws RecognitionException;
+     void entryRuleXCasePart() throws RecognitionException;
+     void ruleXCasePart() throws RecognitionException;
+     void entryRuleXForLoopExpression() throws RecognitionException;
+     void ruleXForLoopExpression() throws RecognitionException;
+     void entryRuleXBasicForLoopExpression() throws RecognitionException;
+     void ruleXBasicForLoopExpression() throws RecognitionException;
+     void entryRuleXWhileExpression() throws RecognitionException;
+     void ruleXWhileExpression() throws RecognitionException;
+     void entryRuleXDoWhileExpression() throws RecognitionException;
+     void ruleXDoWhileExpression() throws RecognitionException;
+     void entryRuleXBlockExpression() throws RecognitionException;
+     void ruleXBlockExpression() throws RecognitionException;
+     void entryRuleXExpressionOrVarDeclaration() throws RecognitionException;
+     void ruleXExpressionOrVarDeclaration() throws RecognitionException;
+     void entryRuleXVariableDeclaration() throws RecognitionException;
+     void ruleXVariableDeclaration() throws RecognitionException;
+     void entryRuleJvmFormalParameter() throws RecognitionException;
+     void ruleJvmFormalParameter() throws RecognitionException;
+     void entryRuleFullJvmFormalParameter() throws RecognitionException;
+     void ruleFullJvmFormalParameter() throws RecognitionException;
+     void entryRuleXFeatureCall() throws RecognitionException;
+     void ruleXFeatureCall() throws RecognitionException;
+     void entryRuleFeatureCallID() throws RecognitionException;
+     void ruleFeatureCallID() throws RecognitionException;
+     void entryRuleIdOrSuper() throws RecognitionException;
+     void ruleIdOrSuper() throws RecognitionException;
+     void entryRuleXConstructorCall() throws RecognitionException;
+     void ruleXConstructorCall() throws RecognitionException;
+     void entryRuleXBooleanLiteral() throws RecognitionException;
+     void ruleXBooleanLiteral() throws RecognitionException;
+     void entryRuleXNullLiteral() throws RecognitionException;
+     void ruleXNullLiteral() throws RecognitionException;
+     void entryRuleXNumberLiteral() throws RecognitionException;
+     void ruleXNumberLiteral() throws RecognitionException;
+     void entryRuleXStringLiteral() throws RecognitionException;
+     void ruleXStringLiteral() throws RecognitionException;
+     void entryRuleXTypeLiteral() throws RecognitionException;
+     void ruleXTypeLiteral() throws RecognitionException;
+     void entryRuleXThrowExpression() throws RecognitionException;
+     void ruleXThrowExpression() throws RecognitionException;
+     void entryRuleXReturnExpression() throws RecognitionException;
+     void ruleXReturnExpression() throws RecognitionException;
+     void entryRuleXTryCatchFinallyExpression() throws RecognitionException;
+     void ruleXTryCatchFinallyExpression() throws RecognitionException;
+     void entryRuleXSynchronizedExpression() throws RecognitionException;
+     void ruleXSynchronizedExpression() throws RecognitionException;
+     void entryRuleXCatchClause() throws RecognitionException;
+     void ruleXCatchClause() throws RecognitionException;
+     void entryRuleNumber() throws RecognitionException;
+     void ruleNumber() throws RecognitionException;
+     void entryRuleJvmTypeReference() throws RecognitionException;
+     void ruleJvmTypeReference() throws RecognitionException;
+     void entryRuleArrayBrackets() throws RecognitionException;
+     void ruleArrayBrackets() throws RecognitionException;
+     void entryRuleXFunctionTypeRef() throws RecognitionException;
+     void ruleXFunctionTypeRef() throws RecognitionException;
+     void entryRuleJvmParameterizedTypeReference() throws RecognitionException;
+     void ruleJvmParameterizedTypeReference() throws RecognitionException;
+     void entryRuleJvmArgumentTypeReference() throws RecognitionException;
+     void ruleJvmArgumentTypeReference() throws RecognitionException;
+     void entryRuleJvmWildcardTypeReference() throws RecognitionException;
+     void ruleJvmWildcardTypeReference() throws RecognitionException;
+     void entryRuleJvmUpperBound() throws RecognitionException;
+     void ruleJvmUpperBound() throws RecognitionException;
+     void entryRuleJvmUpperBoundAnded() throws RecognitionException;
+     void ruleJvmUpperBoundAnded() throws RecognitionException;
+     void entryRuleJvmLowerBound() throws RecognitionException;
+     void ruleJvmLowerBound() throws RecognitionException;
+     void entryRuleJvmLowerBoundAnded() throws RecognitionException;
+     void ruleJvmLowerBoundAnded() throws RecognitionException;
+     void entryRuleQualifiedNameWithWildcard() throws RecognitionException;
+     void ruleQualifiedNameWithWildcard() throws RecognitionException;
+     void entryRuleXImportDeclaration() throws RecognitionException;
+     void ruleXImportDeclaration() throws RecognitionException;
+     void entryRuleQualifiedNameInStaticImport() throws RecognitionException;
+     void ruleQualifiedNameInStaticImport() throws RecognitionException;
+     void ruleStatemachineInternalType() throws RecognitionException;
+     void ruleStatemachineControlButtonEventType() throws RecognitionException;
+     void ruleStatemachineEvaluationType() throws RecognitionException;
+     void ruleStatemachineUserMessageType() throws RecognitionException;
+     void ruleStatemachineLineDisplayCursorType() throws RecognitionException;
+     void ruleStatemachineLineDisplayMarqueeType() throws RecognitionException;
+     void ruleStatemachineLineDisplayMarqueeFormat() throws RecognitionException;
+     void ruleStatemachineLineDisplayTextType() throws RecognitionException;
+     void ruleStatemachineLineDisplayScrollTextType() throws RecognitionException;
+     void ruleStatemachinePOSPrinterBarcodeType() throws RecognitionException;
+     void rule__StatemachineAction__Alternatives() throws RecognitionException;
+     void rule__StatemachineActionFieldSource__Alternatives() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceMore__Alternatives() throws RecognitionException;
+     void rule__StatemachineControl__Alternatives() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEvent__Alternatives() throws RecognitionException;
+     void rule__XAnnotation__Alternatives_3_1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Alternatives() throws RecognitionException;
+     void rule__XAnnotationElementValue__Alternatives() throws RecognitionException;
+     void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException;
+     void rule__XAssignment__Alternatives() throws RecognitionException;
+     void rule__OpMultiAssign__Alternatives() throws RecognitionException;
+     void rule__OpEquality__Alternatives() throws RecognitionException;
+     void rule__XRelationalExpression__Alternatives_1() throws RecognitionException;
+     void rule__OpCompare__Alternatives() throws RecognitionException;
+     void rule__OpOther__Alternatives() throws RecognitionException;
+     void rule__OpOther__Alternatives_5_1() throws RecognitionException;
+     void rule__OpOther__Alternatives_6_1() throws RecognitionException;
+     void rule__OpAdd__Alternatives() throws RecognitionException;
+     void rule__OpMulti__Alternatives() throws RecognitionException;
+     void rule__XUnaryOperation__Alternatives() throws RecognitionException;
+     void rule__OpUnary__Alternatives() throws RecognitionException;
+     void rule__OpPostfix__Alternatives() throws RecognitionException;
+     void rule__XMemberFeatureCall__Alternatives_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Alternatives_1_0_0_0_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Alternatives_1_1_0_0_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Alternatives_1_1_3_1() throws RecognitionException;
+     void rule__XPrimaryExpression__Alternatives() throws RecognitionException;
+     void rule__XLiteral__Alternatives() throws RecognitionException;
+     void rule__XCollectionLiteral__Alternatives() throws RecognitionException;
+     void rule__XSwitchExpression__Alternatives_2() throws RecognitionException;
+     void rule__XCasePart__Alternatives_3() throws RecognitionException;
+     void rule__XExpressionOrVarDeclaration__Alternatives() throws RecognitionException;
+     void rule__XVariableDeclaration__Alternatives_1() throws RecognitionException;
+     void rule__XVariableDeclaration__Alternatives_2() throws RecognitionException;
+     void rule__XFeatureCall__Alternatives_3_1() throws RecognitionException;
+     void rule__FeatureCallID__Alternatives() throws RecognitionException;
+     void rule__IdOrSuper__Alternatives() throws RecognitionException;
+     void rule__XConstructorCall__Alternatives_4_1() throws RecognitionException;
+     void rule__XBooleanLiteral__Alternatives_1() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Alternatives_3() throws RecognitionException;
+     void rule__Number__Alternatives() throws RecognitionException;
+     void rule__Number__Alternatives_1_0() throws RecognitionException;
+     void rule__Number__Alternatives_1_1_1() throws RecognitionException;
+     void rule__JvmTypeReference__Alternatives() throws RecognitionException;
+     void rule__JvmArgumentTypeReference__Alternatives() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Alternatives_2() throws RecognitionException;
+     void rule__XImportDeclaration__Alternatives_1() throws RecognitionException;
+     void rule__XImportDeclaration__Alternatives_1_0_3() throws RecognitionException;
+     void rule__StatemachineInternalType__Alternatives() throws RecognitionException;
+     void rule__StatemachineControlButtonEventType__Alternatives() throws RecognitionException;
+     void rule__StatemachineEvaluationType__Alternatives() throws RecognitionException;
+     void rule__StatemachineUserMessageType__Alternatives() throws RecognitionException;
+     void rule__StatemachineLineDisplayCursorType__Alternatives() throws RecognitionException;
+     void rule__StatemachineLineDisplayMarqueeType__Alternatives() throws RecognitionException;
+     void rule__StatemachineLineDisplayMarqueeFormat__Alternatives() throws RecognitionException;
+     void rule__StatemachineLineDisplayTextType__Alternatives() throws RecognitionException;
+     void rule__StatemachineLineDisplayScrollTextType__Alternatives() throws RecognitionException;
+     void rule__StatemachinePOSPrinterBarcodeType__Alternatives() throws RecognitionException;
+     void rule__StatemachinePackage__Group__0() throws RecognitionException;
+     void rule__StatemachinePackage__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachinePackage__Group__1() throws RecognitionException;
+     void rule__StatemachinePackage__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachinePackage__Group__2() throws RecognitionException;
+     void rule__StatemachinePackage__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachinePackage__Group__3() throws RecognitionException;
+     void rule__StatemachinePackage__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachinePackage__Group_3__0() throws RecognitionException;
+     void rule__StatemachinePackage__Group_3__0__Impl() throws RecognitionException;
+     void rule__StatemachinePackage__Group_3__1() throws RecognitionException;
+     void rule__StatemachinePackage__Group_3__1__Impl() throws RecognitionException;
+     void rule__StatemachinePackage__Group_3__2() throws RecognitionException;
+     void rule__StatemachinePackage__Group_3__2__Impl() throws RecognitionException;
+     void rule__StatemachinePackage__Group_3__3() throws RecognitionException;
+     void rule__StatemachinePackage__Group_3__3__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__0() throws RecognitionException;
+     void rule__Statemachine__Group__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__1() throws RecognitionException;
+     void rule__Statemachine__Group__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__2() throws RecognitionException;
+     void rule__Statemachine__Group__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__3() throws RecognitionException;
+     void rule__Statemachine__Group__3__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__4() throws RecognitionException;
+     void rule__Statemachine__Group__4__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__5() throws RecognitionException;
+     void rule__Statemachine__Group__5__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__6() throws RecognitionException;
+     void rule__Statemachine__Group__6__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__7() throws RecognitionException;
+     void rule__Statemachine__Group__7__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__8() throws RecognitionException;
+     void rule__Statemachine__Group__8__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__9() throws RecognitionException;
+     void rule__Statemachine__Group__9__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__10() throws RecognitionException;
+     void rule__Statemachine__Group__10__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_2__0() throws RecognitionException;
+     void rule__Statemachine__Group_2__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_2__1() throws RecognitionException;
+     void rule__Statemachine__Group_2__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_3__0() throws RecognitionException;
+     void rule__Statemachine__Group_3__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_3__1() throws RecognitionException;
+     void rule__Statemachine__Group_3__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8__0() throws RecognitionException;
+     void rule__Statemachine__Group_8__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8__1() throws RecognitionException;
+     void rule__Statemachine__Group_8__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9__0() throws RecognitionException;
+     void rule__Statemachine__Group_9__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9__1() throws RecognitionException;
+     void rule__Statemachine__Group_9__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9__2() throws RecognitionException;
+     void rule__Statemachine__Group_9__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9__3() throws RecognitionException;
+     void rule__Statemachine__Group_9__3__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_10__0() throws RecognitionException;
+     void rule__Statemachine__Group_10__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_10__1() throws RecognitionException;
+     void rule__Statemachine__Group_10__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_10__2() throws RecognitionException;
+     void rule__Statemachine__Group_10__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_10__3() throws RecognitionException;
+     void rule__Statemachine__Group_10__3__Impl() throws RecognitionException;
+     void rule__StatemachineEvent__Group__0() throws RecognitionException;
+     void rule__StatemachineEvent__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineEvent__Group__1() throws RecognitionException;
+     void rule__StatemachineEvent__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group__0() throws RecognitionException;
+     void rule__StatemachineState__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group__1() throws RecognitionException;
+     void rule__StatemachineState__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group__2() throws RecognitionException;
+     void rule__StatemachineState__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group__3() throws RecognitionException;
+     void rule__StatemachineState__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group__4() throws RecognitionException;
+     void rule__StatemachineState__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_0__0() throws RecognitionException;
+     void rule__StatemachineState__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_0__1() throws RecognitionException;
+     void rule__StatemachineState__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_0__2() throws RecognitionException;
+     void rule__StatemachineState__Group_3_0__2__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_0__3() throws RecognitionException;
+     void rule__StatemachineState__Group_3_0__3__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_1__0() throws RecognitionException;
+     void rule__StatemachineState__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_1__1() throws RecognitionException;
+     void rule__StatemachineState__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2__0() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2__0__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2__1() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2__1__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2__2() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2__2__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2__3() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2__3__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2_3__0() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2_3__0__Impl() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2_3__1() throws RecognitionException;
+     void rule__StatemachineState__Group_3_2_3__1__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__0() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__1() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__2() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__3() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__4() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__5() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__6() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__7() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__7__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__8() throws RecognitionException;
+     void rule__StatemachineTrigger__Group__8__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_3__0() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_3__0__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_3__1() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_3__1__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_3__2() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_3__2__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_3__3() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_3__3__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_5__0() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_5__0__Impl() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_5__1() throws RecognitionException;
+     void rule__StatemachineTrigger__Group_5__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralClear__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralClear__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralClear__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralClear__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__7() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__7__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__8() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__8__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__9() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__9__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__10() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__10__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__11() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__11__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__12() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__12__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__13() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__13__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__14() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__Group__14__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDestroyWindow__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDestroyWindow__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDestroyWindow__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDestroyWindow__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group_3__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group_3__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group_3__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__Group_3__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__7() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__7__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__8() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__8__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__9() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group__9__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group_7__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group_7__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group_7__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__Group_7__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralOpenDrawer__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralOpenDrawer__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralOpenDrawer__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralOpenDrawer__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTClose__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTClose__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTClose__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTClose__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTClose__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTClose__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAcknowledge__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAcknowledge__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAcknowledge__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAcknowledge__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAcknowledge__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAcknowledge__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTResponse__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTResponse__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTResponse__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTResponse__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTResponse__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTResponse__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group__2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group_2__0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group_2__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group_2__1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__Group_2__1__Impl() throws RecognitionException;
+     void rule__StatemachineOperation__Group__0() throws RecognitionException;
+     void rule__StatemachineOperation__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineOperation__Group__1() throws RecognitionException;
+     void rule__StatemachineOperation__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineOperation__Group__2() throws RecognitionException;
+     void rule__StatemachineOperation__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineOperation__Group__3() throws RecognitionException;
+     void rule__StatemachineOperation__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineOperation__Group__4() throws RecognitionException;
+     void rule__StatemachineOperation__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineOperation__Group__5() throws RecognitionException;
+     void rule__StatemachineOperation__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group__0() throws RecognitionException;
+     void rule__StatemachineGuard__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group__1() throws RecognitionException;
+     void rule__StatemachineGuard__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group__2() throws RecognitionException;
+     void rule__StatemachineGuard__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__0() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__0__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__1() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__1__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__2() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__2__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__3() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__3__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__4() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__4__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__5() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__5__Impl() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__6() throws RecognitionException;
+     void rule__StatemachineGuard__Group_2__6__Impl() throws RecognitionException;
+     void rule__StatemachineFunction__Group__0() throws RecognitionException;
+     void rule__StatemachineFunction__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineFunction__Group__1() throws RecognitionException;
+     void rule__StatemachineFunction__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineFunction__Group__2() throws RecognitionException;
+     void rule__StatemachineFunction__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineFunction__Group__3() throws RecognitionException;
+     void rule__StatemachineFunction__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineFunction__Group__4() throws RecognitionException;
+     void rule__StatemachineFunction__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineFunction__Group__5() throws RecognitionException;
+     void rule__StatemachineFunction__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineStorage__Group__0() throws RecognitionException;
+     void rule__StatemachineStorage__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineStorage__Group__1() throws RecognitionException;
+     void rule__StatemachineStorage__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineStorage__Group__2() throws RecognitionException;
+     void rule__StatemachineStorage__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineStorage__Group__3() throws RecognitionException;
+     void rule__StatemachineStorage__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineStorage__Group__4() throws RecognitionException;
+     void rule__StatemachineStorage__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineStorage__Group__5() throws RecognitionException;
+     void rule__StatemachineStorage__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__0() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__1() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__2() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__3() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__4() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__0() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__1() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__2() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__3() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__4() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__5() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvent__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvent__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvent__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvent__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslate__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslate__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslate__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslate__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__Group__2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__Group__3() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceStringMore__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceStringMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceStringMore__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceStringMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceStringMore__Group__2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceStringMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceNumberMore__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceNumberMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceNumberMore__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceNumberMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceNumberMore__Group__2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceNumberMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvaluateMore__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvaluateMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvaluateMore__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvaluateMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvaluateMore__Group__2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvaluateMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__Group__2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__Group__3() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__Group__2() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__Group__3() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineOperationMore__Group__0() throws RecognitionException;
+     void rule__StatemachineOperationMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineOperationMore__Group__1() throws RecognitionException;
+     void rule__StatemachineOperationMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineOperationMore__Group__2() throws RecognitionException;
+     void rule__StatemachineOperationMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineOperationMore__Group__3() throws RecognitionException;
+     void rule__StatemachineOperationMore__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__0() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__1() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__2() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__3() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__4() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__5() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__6() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__3() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__4() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__5() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldConcatenation__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldConcatenation__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldConcatenation__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldConcatenation__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineOperationParameterMore__Group__0() throws RecognitionException;
+     void rule__StatemachineOperationParameterMore__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineOperationParameterMore__Group__1() throws RecognitionException;
+     void rule__StatemachineOperationParameterMore__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineOperationParameterMore__Group__2() throws RecognitionException;
+     void rule__StatemachineOperationParameterMore__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__Group__2() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__Group__3() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldClear__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldClear__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldClear__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldClear__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldGet__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldGet__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldGet__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldGet__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldRemove__Group__0() throws RecognitionException;
+     void rule__StatemachineActionFieldRemove__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionFieldRemove__Group__1() throws RecognitionException;
+     void rule__StatemachineActionFieldRemove__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionItemVisible__Group__0() throws RecognitionException;
+     void rule__StatemachineActionItemVisible__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionItemVisible__Group__1() throws RecognitionException;
+     void rule__StatemachineActionItemVisible__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionItemInvisible__Group__0() throws RecognitionException;
+     void rule__StatemachineActionItemInvisible__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionItemInvisible__Group__1() throws RecognitionException;
+     void rule__StatemachineActionItemInvisible__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__Group__0() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__Group__1() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__Group__2() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__Group__3() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__Group__0() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__Group__1() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__Group__2() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__Group__3() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__0() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__1() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__2() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__3() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__4() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__5() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineActionScheduler__Group__0() throws RecognitionException;
+     void rule__StatemachineActionScheduler__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineActionScheduler__Group__1() throws RecognitionException;
+     void rule__StatemachineActionScheduler__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__0() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__1() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__2() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__3() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__4() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__5() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__6() throws RecognitionException;
+     void rule__StatemachineControlButton__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineControlField__Group__0() throws RecognitionException;
+     void rule__StatemachineControlField__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlField__Group__1() throws RecognitionException;
+     void rule__StatemachineControlField__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlField__Group__2() throws RecognitionException;
+     void rule__StatemachineControlField__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlField__Group__3() throws RecognitionException;
+     void rule__StatemachineControlField__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlField__Group__4() throws RecognitionException;
+     void rule__StatemachineControlField__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__0() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__1() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__2() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__3() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__4() throws RecognitionException;
+     void rule__StatemachineControlDTO__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__0() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__1() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__2() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__3() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__4() throws RecognitionException;
+     void rule__StatemachineControlScheduler__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceLineDisplay__Group__0() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceLineDisplay__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceLineDisplay__Group__1() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceLineDisplay__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePOSPrinter__Group__0() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePOSPrinter__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePOSPrinter__Group__1() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePOSPrinter__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceCashDrawer__Group__0() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceCashDrawer__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceCashDrawer__Group__1() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceCashDrawer__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePT__Group__0() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePT__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePT__Group__1() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePT__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__0() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__1() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__2() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__3() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__4() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__5() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__6() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__6__Impl() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__7() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__Group__7__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group__0() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group__1() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group__2() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group__3() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group_2__0() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group_2__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group_2__1() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__Group_2__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventKeyboard__Group__0() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventKeyboard__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventKeyboard__Group__1() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventKeyboard__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventKeyboard__Group__2() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventKeyboard__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventIdentity__Group__0() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventIdentity__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventIdentity__Group__1() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventIdentity__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventIdentity__Group__2() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventIdentity__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventEvent__Group__0() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventEvent__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventEvent__Group__1() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventEvent__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventEvent__Group__2() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventEvent__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__Group__0() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__Group__1() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__Group__2() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__Group__3() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlFieldLayout__Group__0() throws RecognitionException;
+     void rule__StatemachineControlFieldLayout__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlFieldLayout__Group__1() throws RecognitionException;
+     void rule__StatemachineControlFieldLayout__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__0() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__1() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__2() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__3() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__4() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group_4__0() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group_4__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group_4__1() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__Group_4__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__0() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__1() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__2() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__3() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__3__Impl() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__4() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__4__Impl() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__5() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__Group__5__Impl() throws RecognitionException;
+     void rule__StatemachineImport__Group__0() throws RecognitionException;
+     void rule__StatemachineImport__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineImport__Group__1() throws RecognitionException;
+     void rule__StatemachineImport__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineQualifiedNameWithWildCard__Group__0() throws RecognitionException;
+     void rule__StatemachineQualifiedNameWithWildCard__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineQualifiedNameWithWildCard__Group__1() throws RecognitionException;
+     void rule__StatemachineQualifiedNameWithWildCard__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineQualifiedNameWithWildCard__Group_1__0() throws RecognitionException;
+     void rule__StatemachineQualifiedNameWithWildCard__Group_1__0__Impl() throws RecognitionException;
+     void rule__StatemachineQualifiedNameWithWildCard__Group_1__1() throws RecognitionException;
+     void rule__StatemachineQualifiedNameWithWildCard__Group_1__1__Impl() throws RecognitionException;
+     void rule__QualifiedName__Group__0() throws RecognitionException;
+     void rule__QualifiedName__Group__0__Impl() throws RecognitionException;
+     void rule__QualifiedName__Group__1() throws RecognitionException;
+     void rule__QualifiedName__Group__1__Impl() throws RecognitionException;
+     void rule__QualifiedName__Group_1__0() throws RecognitionException;
+     void rule__QualifiedName__Group_1__0__Impl() throws RecognitionException;
+     void rule__QualifiedName__Group_1__1() throws RecognitionException;
+     void rule__QualifiedName__Group_1__1__Impl() throws RecognitionException;
+     void rule__SignedNumber__Group__0() throws RecognitionException;
+     void rule__SignedNumber__Group__0__Impl() throws RecognitionException;
+     void rule__SignedNumber__Group__1() throws RecognitionException;
+     void rule__SignedNumber__Group__1__Impl() throws RecognitionException;
+     void rule__UnsignedNumber__Group__0() throws RecognitionException;
+     void rule__UnsignedNumber__Group__0__Impl() throws RecognitionException;
+     void rule__UnsignedNumber__Group__1() throws RecognitionException;
+     void rule__UnsignedNumber__Group__1__Impl() throws RecognitionException;
+     void rule__UnsignedNumber__Group_1__0() throws RecognitionException;
+     void rule__UnsignedNumber__Group_1__0__Impl() throws RecognitionException;
+     void rule__UnsignedNumber__Group_1__1() throws RecognitionException;
+     void rule__UnsignedNumber__Group_1__1__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group__0() throws RecognitionException;
+     void rule__XAnnotation__Group__0__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group__1() throws RecognitionException;
+     void rule__XAnnotation__Group__1__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group__2() throws RecognitionException;
+     void rule__XAnnotation__Group__2__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group__3() throws RecognitionException;
+     void rule__XAnnotation__Group__3__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group_3__0() throws RecognitionException;
+     void rule__XAnnotation__Group_3__0__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group_3__1() throws RecognitionException;
+     void rule__XAnnotation__Group_3__1__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group_3__2() throws RecognitionException;
+     void rule__XAnnotation__Group_3__2__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group_3_1_0__0() throws RecognitionException;
+     void rule__XAnnotation__Group_3_1_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group_3_1_0__1() throws RecognitionException;
+     void rule__XAnnotation__Group_3_1_0__1__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group_3_1_0_1__0() throws RecognitionException;
+     void rule__XAnnotation__Group_3_1_0_1__0__Impl() throws RecognitionException;
+     void rule__XAnnotation__Group_3_1_0_1__1() throws RecognitionException;
+     void rule__XAnnotation__Group_3_1_0_1__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group__0() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group__1() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group_0__0() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group_0_0__0() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group_0_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group_0_0__1() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__Group_0_0__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0__0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0__1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0__2() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_0__0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_1__0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_1__1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1__0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1__1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1_1__0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1_1__1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0__0() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0__1() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0__2() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0__2__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_0__0() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_0_0__0() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_0_0__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_0_0__1() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_0_0__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_0_0__2() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_0_0__2__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_1__0() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_1__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_1__1() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_1__1__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_1_1__0() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_1_1__0__Impl() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_1_1__1() throws RecognitionException;
+     void rule__XAnnotationElementValue__Group_0_1_1__1__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_0__0() throws RecognitionException;
+     void rule__XAssignment__Group_0__0__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_0__1() throws RecognitionException;
+     void rule__XAssignment__Group_0__1__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_0__2() throws RecognitionException;
+     void rule__XAssignment__Group_0__2__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_0__3() throws RecognitionException;
+     void rule__XAssignment__Group_0__3__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_1__0() throws RecognitionException;
+     void rule__XAssignment__Group_1__0__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_1__1() throws RecognitionException;
+     void rule__XAssignment__Group_1__1__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_1_1__0() throws RecognitionException;
+     void rule__XAssignment__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_1_1__1() throws RecognitionException;
+     void rule__XAssignment__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_1_1_0__0() throws RecognitionException;
+     void rule__XAssignment__Group_1_1_0__0__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_1_1_0_0__0() throws RecognitionException;
+     void rule__XAssignment__Group_1_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XAssignment__Group_1_1_0_0__1() throws RecognitionException;
+     void rule__XAssignment__Group_1_1_0_0__1__Impl() throws RecognitionException;
+     void rule__OpMultiAssign__Group_5__0() throws RecognitionException;
+     void rule__OpMultiAssign__Group_5__0__Impl() throws RecognitionException;
+     void rule__OpMultiAssign__Group_5__1() throws RecognitionException;
+     void rule__OpMultiAssign__Group_5__1__Impl() throws RecognitionException;
+     void rule__OpMultiAssign__Group_5__2() throws RecognitionException;
+     void rule__OpMultiAssign__Group_5__2__Impl() throws RecognitionException;
+     void rule__OpMultiAssign__Group_6__0() throws RecognitionException;
+     void rule__OpMultiAssign__Group_6__0__Impl() throws RecognitionException;
+     void rule__OpMultiAssign__Group_6__1() throws RecognitionException;
+     void rule__OpMultiAssign__Group_6__1__Impl() throws RecognitionException;
+     void rule__OpMultiAssign__Group_6__2() throws RecognitionException;
+     void rule__OpMultiAssign__Group_6__2__Impl() throws RecognitionException;
+     void rule__XOrExpression__Group__0() throws RecognitionException;
+     void rule__XOrExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XOrExpression__Group__1() throws RecognitionException;
+     void rule__XOrExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XOrExpression__Group_1__0() throws RecognitionException;
+     void rule__XOrExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__XOrExpression__Group_1__1() throws RecognitionException;
+     void rule__XOrExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__XOrExpression__Group_1_0__0() throws RecognitionException;
+     void rule__XOrExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XOrExpression__Group_1_0_0__0() throws RecognitionException;
+     void rule__XOrExpression__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XOrExpression__Group_1_0_0__1() throws RecognitionException;
+     void rule__XOrExpression__Group_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XAndExpression__Group__0() throws RecognitionException;
+     void rule__XAndExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XAndExpression__Group__1() throws RecognitionException;
+     void rule__XAndExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XAndExpression__Group_1__0() throws RecognitionException;
+     void rule__XAndExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__XAndExpression__Group_1__1() throws RecognitionException;
+     void rule__XAndExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__XAndExpression__Group_1_0__0() throws RecognitionException;
+     void rule__XAndExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XAndExpression__Group_1_0_0__0() throws RecognitionException;
+     void rule__XAndExpression__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XAndExpression__Group_1_0_0__1() throws RecognitionException;
+     void rule__XAndExpression__Group_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XEqualityExpression__Group__0() throws RecognitionException;
+     void rule__XEqualityExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XEqualityExpression__Group__1() throws RecognitionException;
+     void rule__XEqualityExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1__0() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1__1() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1_0__0() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1_0_0__0() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1_0_0__1() throws RecognitionException;
+     void rule__XEqualityExpression__Group_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group__0() throws RecognitionException;
+     void rule__XRelationalExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group__1() throws RecognitionException;
+     void rule__XRelationalExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0__0() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0__1() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0_0__0() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0_0_0__0() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0_0_0__0__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0_0_0__1() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_0_0_0__1__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1__0() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1__1() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1_0__0() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1_0__0__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1_0_0__0() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1_0_0__1() throws RecognitionException;
+     void rule__XRelationalExpression__Group_1_1_0_0__1__Impl() throws RecognitionException;
+     void rule__OpCompare__Group_1__0() throws RecognitionException;
+     void rule__OpCompare__Group_1__0__Impl() throws RecognitionException;
+     void rule__OpCompare__Group_1__1() throws RecognitionException;
+     void rule__OpCompare__Group_1__1__Impl() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group__0() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group__1() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1__0() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1__1() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1_0__0() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1_0_0__0() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1_0_0__1() throws RecognitionException;
+     void rule__XOtherOperatorExpression__Group_1_0_0__1__Impl() throws RecognitionException;
+     void rule__OpOther__Group_2__0() throws RecognitionException;
+     void rule__OpOther__Group_2__0__Impl() throws RecognitionException;
+     void rule__OpOther__Group_2__1() throws RecognitionException;
+     void rule__OpOther__Group_2__1__Impl() throws RecognitionException;
+     void rule__OpOther__Group_5__0() throws RecognitionException;
+     void rule__OpOther__Group_5__0__Impl() throws RecognitionException;
+     void rule__OpOther__Group_5__1() throws RecognitionException;
+     void rule__OpOther__Group_5__1__Impl() throws RecognitionException;
+     void rule__OpOther__Group_5_1_0__0() throws RecognitionException;
+     void rule__OpOther__Group_5_1_0__0__Impl() throws RecognitionException;
+     void rule__OpOther__Group_5_1_0_0__0() throws RecognitionException;
+     void rule__OpOther__Group_5_1_0_0__0__Impl() throws RecognitionException;
+     void rule__OpOther__Group_5_1_0_0__1() throws RecognitionException;
+     void rule__OpOther__Group_5_1_0_0__1__Impl() throws RecognitionException;
+     void rule__OpOther__Group_6__0() throws RecognitionException;
+     void rule__OpOther__Group_6__0__Impl() throws RecognitionException;
+     void rule__OpOther__Group_6__1() throws RecognitionException;
+     void rule__OpOther__Group_6__1__Impl() throws RecognitionException;
+     void rule__OpOther__Group_6_1_0__0() throws RecognitionException;
+     void rule__OpOther__Group_6_1_0__0__Impl() throws RecognitionException;
+     void rule__OpOther__Group_6_1_0_0__0() throws RecognitionException;
+     void rule__OpOther__Group_6_1_0_0__0__Impl() throws RecognitionException;
+     void rule__OpOther__Group_6_1_0_0__1() throws RecognitionException;
+     void rule__OpOther__Group_6_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XAdditiveExpression__Group__0() throws RecognitionException;
+     void rule__XAdditiveExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XAdditiveExpression__Group__1() throws RecognitionException;
+     void rule__XAdditiveExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1__0() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1__1() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1_0__0() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1_0_0__0() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1_0_0__1() throws RecognitionException;
+     void rule__XAdditiveExpression__Group_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group__0() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group__1() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1__0() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1__1() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1_0__0() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1_0_0__0() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1_0_0__1() throws RecognitionException;
+     void rule__XMultiplicativeExpression__Group_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XUnaryOperation__Group_0__0() throws RecognitionException;
+     void rule__XUnaryOperation__Group_0__0__Impl() throws RecognitionException;
+     void rule__XUnaryOperation__Group_0__1() throws RecognitionException;
+     void rule__XUnaryOperation__Group_0__1__Impl() throws RecognitionException;
+     void rule__XUnaryOperation__Group_0__2() throws RecognitionException;
+     void rule__XUnaryOperation__Group_0__2__Impl() throws RecognitionException;
+     void rule__XCastedExpression__Group__0() throws RecognitionException;
+     void rule__XCastedExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XCastedExpression__Group__1() throws RecognitionException;
+     void rule__XCastedExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XCastedExpression__Group_1__0() throws RecognitionException;
+     void rule__XCastedExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__XCastedExpression__Group_1__1() throws RecognitionException;
+     void rule__XCastedExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__XCastedExpression__Group_1_0__0() throws RecognitionException;
+     void rule__XCastedExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XCastedExpression__Group_1_0_0__0() throws RecognitionException;
+     void rule__XCastedExpression__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XCastedExpression__Group_1_0_0__1() throws RecognitionException;
+     void rule__XCastedExpression__Group_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XPostfixOperation__Group__0() throws RecognitionException;
+     void rule__XPostfixOperation__Group__0__Impl() throws RecognitionException;
+     void rule__XPostfixOperation__Group__1() throws RecognitionException;
+     void rule__XPostfixOperation__Group__1__Impl() throws RecognitionException;
+     void rule__XPostfixOperation__Group_1__0() throws RecognitionException;
+     void rule__XPostfixOperation__Group_1__0__Impl() throws RecognitionException;
+     void rule__XPostfixOperation__Group_1_0__0() throws RecognitionException;
+     void rule__XPostfixOperation__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XPostfixOperation__Group_1_0__1() throws RecognitionException;
+     void rule__XPostfixOperation__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0_0__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0_0__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0_0__2() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0_0__3() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__2() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__2__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__3() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__3__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__4() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1__4__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_0__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_0__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_0_0__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_0_0__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1__2() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1__2__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1__3() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1__3__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1_2__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1_2__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3__2() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3__2__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3_1_1__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3_1_1__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1() throws RecognitionException;
+     void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group__0() throws RecognitionException;
+     void rule__XSetLiteral__Group__0__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group__1() throws RecognitionException;
+     void rule__XSetLiteral__Group__1__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group__2() throws RecognitionException;
+     void rule__XSetLiteral__Group__2__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group__3() throws RecognitionException;
+     void rule__XSetLiteral__Group__3__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group__4() throws RecognitionException;
+     void rule__XSetLiteral__Group__4__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group_3__0() throws RecognitionException;
+     void rule__XSetLiteral__Group_3__0__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group_3__1() throws RecognitionException;
+     void rule__XSetLiteral__Group_3__1__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group_3_1__0() throws RecognitionException;
+     void rule__XSetLiteral__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__XSetLiteral__Group_3_1__1() throws RecognitionException;
+     void rule__XSetLiteral__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group__0() throws RecognitionException;
+     void rule__XListLiteral__Group__0__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group__1() throws RecognitionException;
+     void rule__XListLiteral__Group__1__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group__2() throws RecognitionException;
+     void rule__XListLiteral__Group__2__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group__3() throws RecognitionException;
+     void rule__XListLiteral__Group__3__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group__4() throws RecognitionException;
+     void rule__XListLiteral__Group__4__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group_3__0() throws RecognitionException;
+     void rule__XListLiteral__Group_3__0__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group_3__1() throws RecognitionException;
+     void rule__XListLiteral__Group_3__1__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group_3_1__0() throws RecognitionException;
+     void rule__XListLiteral__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__XListLiteral__Group_3_1__1() throws RecognitionException;
+     void rule__XListLiteral__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__XClosure__Group__0() throws RecognitionException;
+     void rule__XClosure__Group__0__Impl() throws RecognitionException;
+     void rule__XClosure__Group__1() throws RecognitionException;
+     void rule__XClosure__Group__1__Impl() throws RecognitionException;
+     void rule__XClosure__Group__2() throws RecognitionException;
+     void rule__XClosure__Group__2__Impl() throws RecognitionException;
+     void rule__XClosure__Group__3() throws RecognitionException;
+     void rule__XClosure__Group__3__Impl() throws RecognitionException;
+     void rule__XClosure__Group_0__0() throws RecognitionException;
+     void rule__XClosure__Group_0__0__Impl() throws RecognitionException;
+     void rule__XClosure__Group_0_0__0() throws RecognitionException;
+     void rule__XClosure__Group_0_0__0__Impl() throws RecognitionException;
+     void rule__XClosure__Group_0_0__1() throws RecognitionException;
+     void rule__XClosure__Group_0_0__1__Impl() throws RecognitionException;
+     void rule__XClosure__Group_1__0() throws RecognitionException;
+     void rule__XClosure__Group_1__0__Impl() throws RecognitionException;
+     void rule__XClosure__Group_1_0__0() throws RecognitionException;
+     void rule__XClosure__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XClosure__Group_1_0__1() throws RecognitionException;
+     void rule__XClosure__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__XClosure__Group_1_0_0__0() throws RecognitionException;
+     void rule__XClosure__Group_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XClosure__Group_1_0_0__1() throws RecognitionException;
+     void rule__XClosure__Group_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XClosure__Group_1_0_0_1__0() throws RecognitionException;
+     void rule__XClosure__Group_1_0_0_1__0__Impl() throws RecognitionException;
+     void rule__XClosure__Group_1_0_0_1__1() throws RecognitionException;
+     void rule__XClosure__Group_1_0_0_1__1__Impl() throws RecognitionException;
+     void rule__XExpressionInClosure__Group__0() throws RecognitionException;
+     void rule__XExpressionInClosure__Group__0__Impl() throws RecognitionException;
+     void rule__XExpressionInClosure__Group__1() throws RecognitionException;
+     void rule__XExpressionInClosure__Group__1__Impl() throws RecognitionException;
+     void rule__XExpressionInClosure__Group_1__0() throws RecognitionException;
+     void rule__XExpressionInClosure__Group_1__0__Impl() throws RecognitionException;
+     void rule__XExpressionInClosure__Group_1__1() throws RecognitionException;
+     void rule__XExpressionInClosure__Group_1__1__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group__0() throws RecognitionException;
+     void rule__XShortClosure__Group__0__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group__1() throws RecognitionException;
+     void rule__XShortClosure__Group__1__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group_0__0() throws RecognitionException;
+     void rule__XShortClosure__Group_0__0__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0__0() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0__0__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0__1() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0__1__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0__2() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0__2__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0_1__0() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0_1__0__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0_1__1() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0_1__1__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0_1_1__0() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0_1_1__0__Impl() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0_1_1__1() throws RecognitionException;
+     void rule__XShortClosure__Group_0_0_1_1__1__Impl() throws RecognitionException;
+     void rule__XParenthesizedExpression__Group__0() throws RecognitionException;
+     void rule__XParenthesizedExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XParenthesizedExpression__Group__1() throws RecognitionException;
+     void rule__XParenthesizedExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XParenthesizedExpression__Group__2() throws RecognitionException;
+     void rule__XParenthesizedExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group__0() throws RecognitionException;
+     void rule__XIfExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group__1() throws RecognitionException;
+     void rule__XIfExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group__2() throws RecognitionException;
+     void rule__XIfExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group__3() throws RecognitionException;
+     void rule__XIfExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group__4() throws RecognitionException;
+     void rule__XIfExpression__Group__4__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group__5() throws RecognitionException;
+     void rule__XIfExpression__Group__5__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group__6() throws RecognitionException;
+     void rule__XIfExpression__Group__6__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group_6__0() throws RecognitionException;
+     void rule__XIfExpression__Group_6__0__Impl() throws RecognitionException;
+     void rule__XIfExpression__Group_6__1() throws RecognitionException;
+     void rule__XIfExpression__Group_6__1__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group__0() throws RecognitionException;
+     void rule__XSwitchExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group__1() throws RecognitionException;
+     void rule__XSwitchExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group__2() throws RecognitionException;
+     void rule__XSwitchExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group__3() throws RecognitionException;
+     void rule__XSwitchExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group__4() throws RecognitionException;
+     void rule__XSwitchExpression__Group__4__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group__5() throws RecognitionException;
+     void rule__XSwitchExpression__Group__5__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group__6() throws RecognitionException;
+     void rule__XSwitchExpression__Group__6__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0__0() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0__0__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0__1() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0__1__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0__2() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0__2__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0_0__0() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0_0__0__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0_0_0__0() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0_0_0__0__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0_0_0__1() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0_0_0__1__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0_0_0__2() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_0_0_0__2__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1__0() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1__0__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1__1() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1__1__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1_0__0() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1_0__0__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1_0_0__0() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1_0_0__0__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1_0_0__1() throws RecognitionException;
+     void rule__XSwitchExpression__Group_2_1_0_0__1__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_5__0() throws RecognitionException;
+     void rule__XSwitchExpression__Group_5__0__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_5__1() throws RecognitionException;
+     void rule__XSwitchExpression__Group_5__1__Impl() throws RecognitionException;
+     void rule__XSwitchExpression__Group_5__2() throws RecognitionException;
+     void rule__XSwitchExpression__Group_5__2__Impl() throws RecognitionException;
+     void rule__XCasePart__Group__0() throws RecognitionException;
+     void rule__XCasePart__Group__0__Impl() throws RecognitionException;
+     void rule__XCasePart__Group__1() throws RecognitionException;
+     void rule__XCasePart__Group__1__Impl() throws RecognitionException;
+     void rule__XCasePart__Group__2() throws RecognitionException;
+     void rule__XCasePart__Group__2__Impl() throws RecognitionException;
+     void rule__XCasePart__Group__3() throws RecognitionException;
+     void rule__XCasePart__Group__3__Impl() throws RecognitionException;
+     void rule__XCasePart__Group_2__0() throws RecognitionException;
+     void rule__XCasePart__Group_2__0__Impl() throws RecognitionException;
+     void rule__XCasePart__Group_2__1() throws RecognitionException;
+     void rule__XCasePart__Group_2__1__Impl() throws RecognitionException;
+     void rule__XCasePart__Group_3_0__0() throws RecognitionException;
+     void rule__XCasePart__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__XCasePart__Group_3_0__1() throws RecognitionException;
+     void rule__XCasePart__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group__0() throws RecognitionException;
+     void rule__XForLoopExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group__1() throws RecognitionException;
+     void rule__XForLoopExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group__2() throws RecognitionException;
+     void rule__XForLoopExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group__3() throws RecognitionException;
+     void rule__XForLoopExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0__0() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0__0__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__0() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__0__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__1() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__1__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__2() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__2__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__3() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__3__Impl() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__4() throws RecognitionException;
+     void rule__XForLoopExpression__Group_0_0__4__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__0() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__1() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__2() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__3() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__4() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__4__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__5() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__5__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__6() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__6__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__7() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__7__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__8() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__8__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__9() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group__9__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_3__0() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_3__0__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_3__1() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_3__1__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_3_1__0() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_3_1__1() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_7__0() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_7__0__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_7__1() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_7__1__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_7_1__0() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_7_1__0__Impl() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_7_1__1() throws RecognitionException;
+     void rule__XBasicForLoopExpression__Group_7_1__1__Impl() throws RecognitionException;
+     void rule__XWhileExpression__Group__0() throws RecognitionException;
+     void rule__XWhileExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XWhileExpression__Group__1() throws RecognitionException;
+     void rule__XWhileExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XWhileExpression__Group__2() throws RecognitionException;
+     void rule__XWhileExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XWhileExpression__Group__3() throws RecognitionException;
+     void rule__XWhileExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XWhileExpression__Group__4() throws RecognitionException;
+     void rule__XWhileExpression__Group__4__Impl() throws RecognitionException;
+     void rule__XWhileExpression__Group__5() throws RecognitionException;
+     void rule__XWhileExpression__Group__5__Impl() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__0() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__1() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__2() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__3() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__4() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__4__Impl() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__5() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__5__Impl() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__6() throws RecognitionException;
+     void rule__XDoWhileExpression__Group__6__Impl() throws RecognitionException;
+     void rule__XBlockExpression__Group__0() throws RecognitionException;
+     void rule__XBlockExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XBlockExpression__Group__1() throws RecognitionException;
+     void rule__XBlockExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XBlockExpression__Group__2() throws RecognitionException;
+     void rule__XBlockExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XBlockExpression__Group__3() throws RecognitionException;
+     void rule__XBlockExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XBlockExpression__Group_2__0() throws RecognitionException;
+     void rule__XBlockExpression__Group_2__0__Impl() throws RecognitionException;
+     void rule__XBlockExpression__Group_2__1() throws RecognitionException;
+     void rule__XBlockExpression__Group_2__1__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group__0() throws RecognitionException;
+     void rule__XVariableDeclaration__Group__0__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group__1() throws RecognitionException;
+     void rule__XVariableDeclaration__Group__1__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group__2() throws RecognitionException;
+     void rule__XVariableDeclaration__Group__2__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group__3() throws RecognitionException;
+     void rule__XVariableDeclaration__Group__3__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_2_0__0() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_2_0__0__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_2_0_0__0() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_2_0_0__0__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_2_0_0__1() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_2_0_0__1__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_3__0() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_3__0__Impl() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_3__1() throws RecognitionException;
+     void rule__XVariableDeclaration__Group_3__1__Impl() throws RecognitionException;
+     void rule__JvmFormalParameter__Group__0() throws RecognitionException;
+     void rule__JvmFormalParameter__Group__0__Impl() throws RecognitionException;
+     void rule__JvmFormalParameter__Group__1() throws RecognitionException;
+     void rule__JvmFormalParameter__Group__1__Impl() throws RecognitionException;
+     void rule__FullJvmFormalParameter__Group__0() throws RecognitionException;
+     void rule__FullJvmFormalParameter__Group__0__Impl() throws RecognitionException;
+     void rule__FullJvmFormalParameter__Group__1() throws RecognitionException;
+     void rule__FullJvmFormalParameter__Group__1__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group__0() throws RecognitionException;
+     void rule__XFeatureCall__Group__0__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group__1() throws RecognitionException;
+     void rule__XFeatureCall__Group__1__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group__2() throws RecognitionException;
+     void rule__XFeatureCall__Group__2__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group__3() throws RecognitionException;
+     void rule__XFeatureCall__Group__3__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group__4() throws RecognitionException;
+     void rule__XFeatureCall__Group__4__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_1__0() throws RecognitionException;
+     void rule__XFeatureCall__Group_1__0__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_1__1() throws RecognitionException;
+     void rule__XFeatureCall__Group_1__1__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_1__2() throws RecognitionException;
+     void rule__XFeatureCall__Group_1__2__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_1__3() throws RecognitionException;
+     void rule__XFeatureCall__Group_1__3__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_1_2__0() throws RecognitionException;
+     void rule__XFeatureCall__Group_1_2__0__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_1_2__1() throws RecognitionException;
+     void rule__XFeatureCall__Group_1_2__1__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_3__0() throws RecognitionException;
+     void rule__XFeatureCall__Group_3__0__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_3__1() throws RecognitionException;
+     void rule__XFeatureCall__Group_3__1__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_3__2() throws RecognitionException;
+     void rule__XFeatureCall__Group_3__2__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_3_1_1__0() throws RecognitionException;
+     void rule__XFeatureCall__Group_3_1_1__0__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_3_1_1__1() throws RecognitionException;
+     void rule__XFeatureCall__Group_3_1_1__1__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_3_1_1_1__0() throws RecognitionException;
+     void rule__XFeatureCall__Group_3_1_1_1__0__Impl() throws RecognitionException;
+     void rule__XFeatureCall__Group_3_1_1_1__1() throws RecognitionException;
+     void rule__XFeatureCall__Group_3_1_1_1__1__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group__0() throws RecognitionException;
+     void rule__XConstructorCall__Group__0__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group__1() throws RecognitionException;
+     void rule__XConstructorCall__Group__1__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group__2() throws RecognitionException;
+     void rule__XConstructorCall__Group__2__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group__3() throws RecognitionException;
+     void rule__XConstructorCall__Group__3__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group__4() throws RecognitionException;
+     void rule__XConstructorCall__Group__4__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group__5() throws RecognitionException;
+     void rule__XConstructorCall__Group__5__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_3__0() throws RecognitionException;
+     void rule__XConstructorCall__Group_3__0__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_3__1() throws RecognitionException;
+     void rule__XConstructorCall__Group_3__1__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_3__2() throws RecognitionException;
+     void rule__XConstructorCall__Group_3__2__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_3__3() throws RecognitionException;
+     void rule__XConstructorCall__Group_3__3__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_3_2__0() throws RecognitionException;
+     void rule__XConstructorCall__Group_3_2__0__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_3_2__1() throws RecognitionException;
+     void rule__XConstructorCall__Group_3_2__1__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_4__0() throws RecognitionException;
+     void rule__XConstructorCall__Group_4__0__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_4__1() throws RecognitionException;
+     void rule__XConstructorCall__Group_4__1__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_4__2() throws RecognitionException;
+     void rule__XConstructorCall__Group_4__2__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_4_1_1__0() throws RecognitionException;
+     void rule__XConstructorCall__Group_4_1_1__0__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_4_1_1__1() throws RecognitionException;
+     void rule__XConstructorCall__Group_4_1_1__1__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_4_1_1_1__0() throws RecognitionException;
+     void rule__XConstructorCall__Group_4_1_1_1__0__Impl() throws RecognitionException;
+     void rule__XConstructorCall__Group_4_1_1_1__1() throws RecognitionException;
+     void rule__XConstructorCall__Group_4_1_1_1__1__Impl() throws RecognitionException;
+     void rule__XBooleanLiteral__Group__0() throws RecognitionException;
+     void rule__XBooleanLiteral__Group__0__Impl() throws RecognitionException;
+     void rule__XBooleanLiteral__Group__1() throws RecognitionException;
+     void rule__XBooleanLiteral__Group__1__Impl() throws RecognitionException;
+     void rule__XNullLiteral__Group__0() throws RecognitionException;
+     void rule__XNullLiteral__Group__0__Impl() throws RecognitionException;
+     void rule__XNullLiteral__Group__1() throws RecognitionException;
+     void rule__XNullLiteral__Group__1__Impl() throws RecognitionException;
+     void rule__XNumberLiteral__Group__0() throws RecognitionException;
+     void rule__XNumberLiteral__Group__0__Impl() throws RecognitionException;
+     void rule__XNumberLiteral__Group__1() throws RecognitionException;
+     void rule__XNumberLiteral__Group__1__Impl() throws RecognitionException;
+     void rule__XStringLiteral__Group__0() throws RecognitionException;
+     void rule__XStringLiteral__Group__0__Impl() throws RecognitionException;
+     void rule__XStringLiteral__Group__1() throws RecognitionException;
+     void rule__XStringLiteral__Group__1__Impl() throws RecognitionException;
+     void rule__XTypeLiteral__Group__0() throws RecognitionException;
+     void rule__XTypeLiteral__Group__0__Impl() throws RecognitionException;
+     void rule__XTypeLiteral__Group__1() throws RecognitionException;
+     void rule__XTypeLiteral__Group__1__Impl() throws RecognitionException;
+     void rule__XTypeLiteral__Group__2() throws RecognitionException;
+     void rule__XTypeLiteral__Group__2__Impl() throws RecognitionException;
+     void rule__XTypeLiteral__Group__3() throws RecognitionException;
+     void rule__XTypeLiteral__Group__3__Impl() throws RecognitionException;
+     void rule__XTypeLiteral__Group__4() throws RecognitionException;
+     void rule__XTypeLiteral__Group__4__Impl() throws RecognitionException;
+     void rule__XTypeLiteral__Group__5() throws RecognitionException;
+     void rule__XTypeLiteral__Group__5__Impl() throws RecognitionException;
+     void rule__XThrowExpression__Group__0() throws RecognitionException;
+     void rule__XThrowExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XThrowExpression__Group__1() throws RecognitionException;
+     void rule__XThrowExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XThrowExpression__Group__2() throws RecognitionException;
+     void rule__XThrowExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XReturnExpression__Group__0() throws RecognitionException;
+     void rule__XReturnExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XReturnExpression__Group__1() throws RecognitionException;
+     void rule__XReturnExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XReturnExpression__Group__2() throws RecognitionException;
+     void rule__XReturnExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group__0() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group__1() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group__2() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group__3() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_0__0() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_0__1() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_0_1__0() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_0_1__1() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_1__0() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_1__1() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group__0() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group__0__Impl() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group__1() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group__1__Impl() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group__2() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group__2__Impl() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group__3() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group__3__Impl() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group_0__0() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group_0__0__Impl() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group_0_0__0() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group_0_0__0__Impl() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group_0_0__1() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group_0_0__1__Impl() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group_0_0__2() throws RecognitionException;
+     void rule__XSynchronizedExpression__Group_0_0__2__Impl() throws RecognitionException;
+     void rule__XCatchClause__Group__0() throws RecognitionException;
+     void rule__XCatchClause__Group__0__Impl() throws RecognitionException;
+     void rule__XCatchClause__Group__1() throws RecognitionException;
+     void rule__XCatchClause__Group__1__Impl() throws RecognitionException;
+     void rule__XCatchClause__Group__2() throws RecognitionException;
+     void rule__XCatchClause__Group__2__Impl() throws RecognitionException;
+     void rule__XCatchClause__Group__3() throws RecognitionException;
+     void rule__XCatchClause__Group__3__Impl() throws RecognitionException;
+     void rule__XCatchClause__Group__4() throws RecognitionException;
+     void rule__XCatchClause__Group__4__Impl() throws RecognitionException;
+     void rule__Number__Group_1__0() throws RecognitionException;
+     void rule__Number__Group_1__0__Impl() throws RecognitionException;
+     void rule__Number__Group_1__1() throws RecognitionException;
+     void rule__Number__Group_1__1__Impl() throws RecognitionException;
+     void rule__Number__Group_1_1__0() throws RecognitionException;
+     void rule__Number__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__Number__Group_1_1__1() throws RecognitionException;
+     void rule__Number__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0__0() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0__0__Impl() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0__1() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0__1__Impl() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0_1__0() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0_1__0__Impl() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0_1_0__0() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0_1_0__0__Impl() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0_1_0__1() throws RecognitionException;
+     void rule__JvmTypeReference__Group_0_1_0__1__Impl() throws RecognitionException;
+     void rule__ArrayBrackets__Group__0() throws RecognitionException;
+     void rule__ArrayBrackets__Group__0__Impl() throws RecognitionException;
+     void rule__ArrayBrackets__Group__1() throws RecognitionException;
+     void rule__ArrayBrackets__Group__1__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group__0() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group__0__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group__1() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group__1__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group__2() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group__2__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0__0() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0__0__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0__1() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0__1__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0__2() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0__2__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0_1__0() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0_1__0__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0_1__1() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0_1__1__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0_1_1__0() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0_1_1__0__Impl() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0_1_1__1() throws RecognitionException;
+     void rule__XFunctionTypeRef__Group_0_1_1__1__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group__0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group__0__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group__1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group__1__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__0__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__1__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__2() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__2__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__3() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__3__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__4() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1__4__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_2__0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_2__0__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_2__1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_2__1__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4__0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4__0__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4__1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4__1__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4__2() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4__2__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_0__0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2__0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2__1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2__2() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2__3() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group__0() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group__0__Impl() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group__1() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group__1__Impl() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group__2() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group__2__Impl() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group_2_0__0() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group_2_0__0__Impl() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group_2_0__1() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group_2_0__1__Impl() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group_2_1__0() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group_2_1__0__Impl() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group_2_1__1() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__Group_2_1__1__Impl() throws RecognitionException;
+     void rule__JvmUpperBound__Group__0() throws RecognitionException;
+     void rule__JvmUpperBound__Group__0__Impl() throws RecognitionException;
+     void rule__JvmUpperBound__Group__1() throws RecognitionException;
+     void rule__JvmUpperBound__Group__1__Impl() throws RecognitionException;
+     void rule__JvmUpperBoundAnded__Group__0() throws RecognitionException;
+     void rule__JvmUpperBoundAnded__Group__0__Impl() throws RecognitionException;
+     void rule__JvmUpperBoundAnded__Group__1() throws RecognitionException;
+     void rule__JvmUpperBoundAnded__Group__1__Impl() throws RecognitionException;
+     void rule__JvmLowerBound__Group__0() throws RecognitionException;
+     void rule__JvmLowerBound__Group__0__Impl() throws RecognitionException;
+     void rule__JvmLowerBound__Group__1() throws RecognitionException;
+     void rule__JvmLowerBound__Group__1__Impl() throws RecognitionException;
+     void rule__JvmLowerBoundAnded__Group__0() throws RecognitionException;
+     void rule__JvmLowerBoundAnded__Group__0__Impl() throws RecognitionException;
+     void rule__JvmLowerBoundAnded__Group__1() throws RecognitionException;
+     void rule__JvmLowerBoundAnded__Group__1__Impl() throws RecognitionException;
+     void rule__QualifiedNameWithWildcard__Group__0() throws RecognitionException;
+     void rule__QualifiedNameWithWildcard__Group__0__Impl() throws RecognitionException;
+     void rule__QualifiedNameWithWildcard__Group__1() throws RecognitionException;
+     void rule__QualifiedNameWithWildcard__Group__1__Impl() throws RecognitionException;
+     void rule__QualifiedNameWithWildcard__Group__2() throws RecognitionException;
+     void rule__QualifiedNameWithWildcard__Group__2__Impl() throws RecognitionException;
+     void rule__XImportDeclaration__Group__0() throws RecognitionException;
+     void rule__XImportDeclaration__Group__0__Impl() throws RecognitionException;
+     void rule__XImportDeclaration__Group__1() throws RecognitionException;
+     void rule__XImportDeclaration__Group__1__Impl() throws RecognitionException;
+     void rule__XImportDeclaration__Group__2() throws RecognitionException;
+     void rule__XImportDeclaration__Group__2__Impl() throws RecognitionException;
+     void rule__XImportDeclaration__Group_1_0__0() throws RecognitionException;
+     void rule__XImportDeclaration__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__XImportDeclaration__Group_1_0__1() throws RecognitionException;
+     void rule__XImportDeclaration__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__XImportDeclaration__Group_1_0__2() throws RecognitionException;
+     void rule__XImportDeclaration__Group_1_0__2__Impl() throws RecognitionException;
+     void rule__XImportDeclaration__Group_1_0__3() throws RecognitionException;
+     void rule__XImportDeclaration__Group_1_0__3__Impl() throws RecognitionException;
+     void rule__QualifiedNameInStaticImport__Group__0() throws RecognitionException;
+     void rule__QualifiedNameInStaticImport__Group__0__Impl() throws RecognitionException;
+     void rule__QualifiedNameInStaticImport__Group__1() throws RecognitionException;
+     void rule__QualifiedNameInStaticImport__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineState__UnorderedGroup_3() throws RecognitionException;
+     void rule__StatemachineState__UnorderedGroup_3__Impl() throws RecognitionException;
+     void rule__StatemachineState__UnorderedGroup_3__0() throws RecognitionException;
+     void rule__StatemachineState__UnorderedGroup_3__1() throws RecognitionException;
+     void rule__StatemachineState__UnorderedGroup_3__2() throws RecognitionException;
+     void rule__StatemachineControlField__UnorderedGroup_3() throws RecognitionException;
+     void rule__StatemachineControlField__UnorderedGroup_3__Impl() throws RecognitionException;
+     void rule__StatemachineControlField__UnorderedGroup_3__0() throws RecognitionException;
+     void rule__StatemachineControlField__UnorderedGroup_3__1() throws RecognitionException;
+     void rule__StatemachineModel__PackagesAssignment() throws RecognitionException;
+     void rule__StatemachinePackage__NameAssignment_2() throws RecognitionException;
+     void rule__StatemachinePackage__ImportsAssignment_3_1() throws RecognitionException;
+     void rule__StatemachinePackage__StatemachinesAssignment_3_2() throws RecognitionException;
+     void rule__Statemachine__NameAssignment_1() throws RecognitionException;
+     void rule__Statemachine__DescriptionAssignment_2_0() throws RecognitionException;
+     void rule__Statemachine__DescriptionValueAssignment_2_1() throws RecognitionException;
+     void rule__Statemachine__FunctionGroupAssignment_3_1() throws RecognitionException;
+     void rule__Statemachine__InitialStateAssignment_5() throws RecognitionException;
+     void rule__Statemachine__InitialEventAssignment_7() throws RecognitionException;
+     void rule__Statemachine__EventsAssignment_8_1_1() throws RecognitionException;
+     void rule__Statemachine__ControlsAssignment_9_2() throws RecognitionException;
+     void rule__Statemachine__StatesAssignment_10_2() throws RecognitionException;
+     void rule__StatemachineEvent__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineState__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineState__TriggersAssignment_3_0_2() throws RecognitionException;
+     void rule__StatemachineState__IdentityAssignment_3_1_1() throws RecognitionException;
+     void rule__StatemachineState__KeystrokeAssignment_3_2_2() throws RecognitionException;
+     void rule__StatemachineState__HasKeyOperationAssignment_3_2_3_0() throws RecognitionException;
+     void rule__StatemachineState__KeyOperationAssignment_3_2_3_1() throws RecognitionException;
+     void rule__StatemachineTrigger__TriggersAssignment_2() throws RecognitionException;
+     void rule__StatemachineTrigger__GuardsAssignment_3_2() throws RecognitionException;
+     void rule__StatemachineTrigger__HasTransitionAssignment_5_0() throws RecognitionException;
+     void rule__StatemachineTrigger__TransitionAssignment_5_1() throws RecognitionException;
+     void rule__StatemachineTrigger__ActionsAssignment_7() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__BlinkRateAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralBlinkRate__DeviceAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralClear__DeviceAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__ViewportRowAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__ViewportColumnAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__ViewportHeightAssignment_6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__ViewportWidthAssignment_8() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__WindowHeightAssignment_10() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__WindowWidthAssignment_12() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCreateWindow__DeviceAssignment_14() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__CursorTypeAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralCursorType__DeviceAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDestroyWindow__DeviceAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__BrightnessAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDeviceBrightness__DeviceAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__BitmapIdAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayBitmap__DeviceAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__TextAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__HasTypeAssignment_3_0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__TextTypeAssignment_3_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayText__DeviceAssignment_5() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__TextAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__RowAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__ColumnAssignment_6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__HasTypeAssignment_7_0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__TextTypeAssignment_7_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralDisplayTextAt__DeviceAssignment_9() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__WaitAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralInterCharacterWait__DeviceAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__FormatAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeFormat__DeviceAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__WaitAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeRepeatWait__DeviceAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__MarqueeTypeAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeType__DeviceAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__WaitAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralMarqueeUnitWait__DeviceAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__DirectionAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__UnitsAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralScroll__DeviceAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralOpenDrawer__DeviceAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__DataAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__BarcodeTypeAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBarcode__DeviceAssignment_6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__BitmapIdAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintBitmap__DeviceAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__TextAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintCut__DeviceAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__TextAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintNormal__DeviceAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__BitmapIdAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__NameAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintRegisterBitmap__DeviceAssignment_6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__HostAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__PortAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTOpen__DeviceAssignment_6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTClose__DeviceAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAcknowledge__DeviceAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__PasswordAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__ReceiptAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTReversal__DeviceAssignment_6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__PasswordAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__ConfigurationAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTRegistration__DeviceAssignment_6() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__AmountAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTAuthorization__DeviceAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPTResponse__DeviceAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__ReportAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__HasFilterAssignment_2_0() throws RecognitionException;
+     void rule__StatemachineActionPeripheralPrintReport__KeyAssignment_2_1() throws RecognitionException;
+     void rule__StatemachineOperation__OperationAssignment_1() throws RecognitionException;
+     void rule__StatemachineOperation__FirstAssignment_3() throws RecognitionException;
+     void rule__StatemachineOperation__MoreAssignment_4() throws RecognitionException;
+     void rule__StatemachineGuard__GuardAssignment_1() throws RecognitionException;
+     void rule__StatemachineGuard__HasOnFailAssignment_2_0() throws RecognitionException;
+     void rule__StatemachineGuard__OnFailCaptionAssignment_2_2() throws RecognitionException;
+     void rule__StatemachineGuard__OnFailDescriptionAssignment_2_4() throws RecognitionException;
+     void rule__StatemachineGuard__OnFailTypeAssignment_2_6() throws RecognitionException;
+     void rule__StatemachineFunction__FunctionAssignment_1() throws RecognitionException;
+     void rule__StatemachineFunction__FirstAssignment_3() throws RecognitionException;
+     void rule__StatemachineFunction__MoreAssignment_4() throws RecognitionException;
+     void rule__StatemachineStorage__ContentAssignment_1() throws RecognitionException;
+     void rule__StatemachineStorage__KeyAssignment_3() throws RecognitionException;
+     void rule__StatemachineStorage__AttributeAssignment_5() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__KeyAssignment_2() throws RecognitionException;
+     void rule__StatemachineStorageRetrieve__AttributeAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__TransitionAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__GuardAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionConditionalTransition__ActionsAssignment_4() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceString__TextAssignment() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceNumber__ValueAssignment() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvaluate__EvaluationtypeAssignment() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslate__TextAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__DtoAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttribute__AttributeAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceStringMore__TextAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceNumberMore__ValueAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceEvaluateMore__EvaluationtypeAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceTranslateMore__TextAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionFieldGetMore__AttributeAssignment_3() throws RecognitionException;
+     void rule__StatemachineOperationMore__OperationAssignment_3() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__KeyAssignment_4() throws RecognitionException;
+     void rule__StatemachineStorageRetrieveMore__AttributeAssignment_6() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__DtoAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionFieldSourceDtoAttributeMore__AttributeAssignment_5() throws RecognitionException;
+     void rule__StatemachineActionFieldConcatenation__FirstAssignment_0() throws RecognitionException;
+     void rule__StatemachineActionFieldConcatenation__MoreAssignment_1() throws RecognitionException;
+     void rule__StatemachineOperationParameter__SourceAssignment() throws RecognitionException;
+     void rule__StatemachineOperationParameterMore__SourceAssignment_2() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__SourceAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionFieldSet__AttributeAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionFieldClear__AttributeAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionFieldGet__AttributeAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionFieldRemove__AttributeAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionItemVisible__AttributeAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionItemInvisible__AttributeAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__CaptionAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionButtonCaption__AttributeAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__ImageAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionButtonImage__AttributeAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__SearchAssignment_1() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__DtoAssignment_3() throws RecognitionException;
+     void rule__StatemachineActionDTOFind__AttributeAssignment_5() throws RecognitionException;
+     void rule__StatemachineActionScheduler__SchedulerAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlButton__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlButton__EventTypeAssignment_3() throws RecognitionException;
+     void rule__StatemachineControlButton__ButtonsAssignment_5() throws RecognitionException;
+     void rule__StatemachineControlField__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlField__FieldsAssignment_3_0() throws RecognitionException;
+     void rule__StatemachineControlField__LayoutsAssignment_3_1() throws RecognitionException;
+     void rule__StatemachineControlDTO__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlDTO__DtosAssignment_3() throws RecognitionException;
+     void rule__StatemachineControlScheduler__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlScheduler__SchedulersAssignment_3() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceLineDisplay__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePOSPrinter__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachinePeripheralDeviceCashDrawer__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachinePeripheralDevicePT__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__LineDisplaysAssignment_3() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__PosPrintersAssignment_4() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__CashDrawersAssignment_5() throws RecognitionException;
+     void rule__StatemachineControlPeripheral__PaymentTerminalsAssignment_6() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__HasImageAssignment_2_0() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__ImageAssignment_2_1() throws RecognitionException;
+     void rule__StatemachineControlButtonAttribute__EventAssignment_3() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventKeyboard__KeystrokeAssignment_2() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventIdentity__IdentityAssignment_2() throws RecognitionException;
+     void rule__StatemachineControlButtonAttributeEventEvent__EventAssignment_2() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlFieldAttribute__AttributeTypeAssignment_3() throws RecognitionException;
+     void rule__StatemachineControlFieldLayout__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__AttributeTypeAssignment_3() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__HasEventAssignment_4_0() throws RecognitionException;
+     void rule__StatemachineControlDTOAttribute__EventAssignment_4_1() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__NameAssignment_1() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__DelayAssignment_3() throws RecognitionException;
+     void rule__StatemachineControlSchedulerAttribute__EventAssignment_5() throws RecognitionException;
+     void rule__StatemachineDTOType__AttributeTypeAssignment() throws RecognitionException;
+     void rule__StatemachineFieldType__AttributeTypeAssignment() throws RecognitionException;
+     void rule__StatemachineImport__ImportedNamespaceAssignment_1() throws RecognitionException;
+     void rule__XAnnotation__AnnotationTypeAssignment_2() throws RecognitionException;
+     void rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0() throws RecognitionException;
+     void rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1() throws RecognitionException;
+     void rule__XAnnotation__ValueAssignment_3_1_1() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__ElementAssignment_0_0_0() throws RecognitionException;
+     void rule__XAnnotationElementValuePair__ValueAssignment_1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1() throws RecognitionException;
+     void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1() throws RecognitionException;
+     void rule__XAnnotationElementValue__ElementsAssignment_0_1_0() throws RecognitionException;
+     void rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1() throws RecognitionException;
+     void rule__XAssignment__FeatureAssignment_0_1() throws RecognitionException;
+     void rule__XAssignment__ValueAssignment_0_3() throws RecognitionException;
+     void rule__XAssignment__FeatureAssignment_1_1_0_0_1() throws RecognitionException;
+     void rule__XAssignment__RightOperandAssignment_1_1_1() throws RecognitionException;
+     void rule__XOrExpression__FeatureAssignment_1_0_0_1() throws RecognitionException;
+     void rule__XOrExpression__RightOperandAssignment_1_1() throws RecognitionException;
+     void rule__XAndExpression__FeatureAssignment_1_0_0_1() throws RecognitionException;
+     void rule__XAndExpression__RightOperandAssignment_1_1() throws RecognitionException;
+     void rule__XEqualityExpression__FeatureAssignment_1_0_0_1() throws RecognitionException;
+     void rule__XEqualityExpression__RightOperandAssignment_1_1() throws RecognitionException;
+     void rule__XRelationalExpression__TypeAssignment_1_0_1() throws RecognitionException;
+     void rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1() throws RecognitionException;
+     void rule__XRelationalExpression__RightOperandAssignment_1_1_1() throws RecognitionException;
+     void rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1() throws RecognitionException;
+     void rule__XOtherOperatorExpression__RightOperandAssignment_1_1() throws RecognitionException;
+     void rule__XAdditiveExpression__FeatureAssignment_1_0_0_1() throws RecognitionException;
+     void rule__XAdditiveExpression__RightOperandAssignment_1_1() throws RecognitionException;
+     void rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1() throws RecognitionException;
+     void rule__XMultiplicativeExpression__RightOperandAssignment_1_1() throws RecognitionException;
+     void rule__XUnaryOperation__FeatureAssignment_0_1() throws RecognitionException;
+     void rule__XUnaryOperation__OperandAssignment_0_2() throws RecognitionException;
+     void rule__XCastedExpression__TypeAssignment_1_1() throws RecognitionException;
+     void rule__XPostfixOperation__FeatureAssignment_1_0_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2() throws RecognitionException;
+     void rule__XMemberFeatureCall__ValueAssignment_1_0_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2() throws RecognitionException;
+     void rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__FeatureAssignment_1_1_2() throws RecognitionException;
+     void rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0() throws RecognitionException;
+     void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0() throws RecognitionException;
+     void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0() throws RecognitionException;
+     void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1() throws RecognitionException;
+     void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4() throws RecognitionException;
+     void rule__XSetLiteral__ElementsAssignment_3_0() throws RecognitionException;
+     void rule__XSetLiteral__ElementsAssignment_3_1_1() throws RecognitionException;
+     void rule__XListLiteral__ElementsAssignment_3_0() throws RecognitionException;
+     void rule__XListLiteral__ElementsAssignment_3_1_1() throws RecognitionException;
+     void rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0() throws RecognitionException;
+     void rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1() throws RecognitionException;
+     void rule__XClosure__ExplicitSyntaxAssignment_1_0_1() throws RecognitionException;
+     void rule__XClosure__ExpressionAssignment_2() throws RecognitionException;
+     void rule__XExpressionInClosure__ExpressionsAssignment_1_0() throws RecognitionException;
+     void rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0() throws RecognitionException;
+     void rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1() throws RecognitionException;
+     void rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2() throws RecognitionException;
+     void rule__XShortClosure__ExpressionAssignment_1() throws RecognitionException;
+     void rule__XIfExpression__IfAssignment_3() throws RecognitionException;
+     void rule__XIfExpression__ThenAssignment_5() throws RecognitionException;
+     void rule__XIfExpression__ElseAssignment_6_1() throws RecognitionException;
+     void rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1() throws RecognitionException;
+     void rule__XSwitchExpression__SwitchAssignment_2_0_1() throws RecognitionException;
+     void rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0() throws RecognitionException;
+     void rule__XSwitchExpression__SwitchAssignment_2_1_1() throws RecognitionException;
+     void rule__XSwitchExpression__CasesAssignment_4() throws RecognitionException;
+     void rule__XSwitchExpression__DefaultAssignment_5_2() throws RecognitionException;
+     void rule__XCasePart__TypeGuardAssignment_1() throws RecognitionException;
+     void rule__XCasePart__CaseAssignment_2_1() throws RecognitionException;
+     void rule__XCasePart__ThenAssignment_3_0_1() throws RecognitionException;
+     void rule__XCasePart__FallThroughAssignment_3_1() throws RecognitionException;
+     void rule__XForLoopExpression__DeclaredParamAssignment_0_0_3() throws RecognitionException;
+     void rule__XForLoopExpression__ForExpressionAssignment_1() throws RecognitionException;
+     void rule__XForLoopExpression__EachExpressionAssignment_3() throws RecognitionException;
+     void rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0() throws RecognitionException;
+     void rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1() throws RecognitionException;
+     void rule__XBasicForLoopExpression__ExpressionAssignment_5() throws RecognitionException;
+     void rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0() throws RecognitionException;
+     void rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1() throws RecognitionException;
+     void rule__XBasicForLoopExpression__EachExpressionAssignment_9() throws RecognitionException;
+     void rule__XWhileExpression__PredicateAssignment_3() throws RecognitionException;
+     void rule__XWhileExpression__BodyAssignment_5() throws RecognitionException;
+     void rule__XDoWhileExpression__BodyAssignment_2() throws RecognitionException;
+     void rule__XDoWhileExpression__PredicateAssignment_5() throws RecognitionException;
+     void rule__XBlockExpression__ExpressionsAssignment_2_0() throws RecognitionException;
+     void rule__XVariableDeclaration__WriteableAssignment_1_0() throws RecognitionException;
+     void rule__XVariableDeclaration__TypeAssignment_2_0_0_0() throws RecognitionException;
+     void rule__XVariableDeclaration__NameAssignment_2_0_0_1() throws RecognitionException;
+     void rule__XVariableDeclaration__NameAssignment_2_1() throws RecognitionException;
+     void rule__XVariableDeclaration__RightAssignment_3_1() throws RecognitionException;
+     void rule__JvmFormalParameter__ParameterTypeAssignment_0() throws RecognitionException;
+     void rule__JvmFormalParameter__NameAssignment_1() throws RecognitionException;
+     void rule__FullJvmFormalParameter__ParameterTypeAssignment_0() throws RecognitionException;
+     void rule__FullJvmFormalParameter__NameAssignment_1() throws RecognitionException;
+     void rule__XFeatureCall__TypeArgumentsAssignment_1_1() throws RecognitionException;
+     void rule__XFeatureCall__TypeArgumentsAssignment_1_2_1() throws RecognitionException;
+     void rule__XFeatureCall__FeatureAssignment_2() throws RecognitionException;
+     void rule__XFeatureCall__ExplicitOperationCallAssignment_3_0() throws RecognitionException;
+     void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0() throws RecognitionException;
+     void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0() throws RecognitionException;
+     void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1() throws RecognitionException;
+     void rule__XFeatureCall__FeatureCallArgumentsAssignment_4() throws RecognitionException;
+     void rule__XConstructorCall__ConstructorAssignment_2() throws RecognitionException;
+     void rule__XConstructorCall__TypeArgumentsAssignment_3_1() throws RecognitionException;
+     void rule__XConstructorCall__TypeArgumentsAssignment_3_2_1() throws RecognitionException;
+     void rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0() throws RecognitionException;
+     void rule__XConstructorCall__ArgumentsAssignment_4_1_0() throws RecognitionException;
+     void rule__XConstructorCall__ArgumentsAssignment_4_1_1_0() throws RecognitionException;
+     void rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1() throws RecognitionException;
+     void rule__XConstructorCall__ArgumentsAssignment_5() throws RecognitionException;
+     void rule__XBooleanLiteral__IsTrueAssignment_1_1() throws RecognitionException;
+     void rule__XNumberLiteral__ValueAssignment_1() throws RecognitionException;
+     void rule__XStringLiteral__ValueAssignment_1() throws RecognitionException;
+     void rule__XTypeLiteral__TypeAssignment_3() throws RecognitionException;
+     void rule__XTypeLiteral__ArrayDimensionsAssignment_4() throws RecognitionException;
+     void rule__XThrowExpression__ExpressionAssignment_2() throws RecognitionException;
+     void rule__XReturnExpression__ExpressionAssignment_2() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__ExpressionAssignment_2() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1() throws RecognitionException;
+     void rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1() throws RecognitionException;
+     void rule__XSynchronizedExpression__ParamAssignment_1() throws RecognitionException;
+     void rule__XSynchronizedExpression__ExpressionAssignment_3() throws RecognitionException;
+     void rule__XCatchClause__DeclaredParamAssignment_2() throws RecognitionException;
+     void rule__XCatchClause__ExpressionAssignment_4() throws RecognitionException;
+     void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0() throws RecognitionException;
+     void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1() throws RecognitionException;
+     void rule__XFunctionTypeRef__ReturnTypeAssignment_2() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__TypeAssignment_0() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1() throws RecognitionException;
+     void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0() throws RecognitionException;
+     void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1() throws RecognitionException;
+     void rule__JvmUpperBound__TypeReferenceAssignment_1() throws RecognitionException;
+     void rule__JvmUpperBoundAnded__TypeReferenceAssignment_1() throws RecognitionException;
+     void rule__JvmLowerBound__TypeReferenceAssignment_1() throws RecognitionException;
+     void rule__JvmLowerBoundAnded__TypeReferenceAssignment_1() throws RecognitionException;
+     void rule__XImportDeclaration__StaticAssignment_1_0_0() throws RecognitionException;
+     void rule__XImportDeclaration__ExtensionAssignment_1_0_1() throws RecognitionException;
+     void rule__XImportDeclaration__ImportedTypeAssignment_1_0_2() throws RecognitionException;
+     void rule__XImportDeclaration__WildcardAssignment_1_0_3_0() throws RecognitionException;
+     void rule__XImportDeclaration__MemberNameAssignment_1_0_3_1() throws RecognitionException;
+     void rule__XImportDeclaration__ImportedTypeAssignment_1_1() throws RecognitionException;
+     void rule__XImportDeclaration__ImportedNamespaceAssignment_1_2() throws RecognitionException;
+     void synpred64_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred65_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred66_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred91_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred92_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred105_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred113_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred114_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred127_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred131_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred132_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred138_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred264_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred276_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred278_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred279_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred280_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred281_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred282_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred283_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred284_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred285_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred286_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred287_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred289_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred290_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred298_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred305_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred308_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred321_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred322_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred326_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred327_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred328_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred333_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred334_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred335_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred337_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred341_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred343_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred344_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred351_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred352_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred353_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred354_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred355_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred356_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred357_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred358_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred359_InternalStatemachineDSL_fragment() throws RecognitionException;   
+     void synpred360_InternalStatemachineDSL_fragment() throws RecognitionException;   
+}
+
+@SuppressWarnings("all")
+abstract class InternalStatemachineDSLParser1 extends AbstractInternalContentAssistParser implements InternalStatemachineDSLParserSignatures {
+
+        InternalStatemachineDSLParser1(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+
+        InternalStatemachineDSLParser1(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+        }
+
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_STRING", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'Boolean'", "'Integer'", "'Long'", "'Double'", "'String'", "'Date'", "'SuggestText'", "'keyboard'", "'trigger'", "'identity'", "'getIPAddress'", "'getNow'", "'getUserAgentInfo'", "'isTouchDevice'", "'isHttps'", "'getBrowserLocale'", "'getUserName'", "'getUserPassword'", "'getUserEmail'", "'getUserPosition'", "'getUserPrintService'", "'getSceenWidth'", "'getScreenHeight'", "'getTrigger'", "'humanized'", "'warning'", "'error'", "'tray'", "'assistive'", "'none'", "'fixed'", "'block'", "'halfblock'", "'underline'", "'reverse'", "'other'", "'blink'", "'up'", "'down'", "'left'", "'right'", "'init'", "'walk'", "'place'", "'normal'", "'blinkreverse'", "'upca'", "'upcb'", "'jan8'", "'ean8'", "'jan13'", "'ean13'", "'tf'", "'itf'", "'codeabar'", "'code39'", "'code93'", "'code128'", "'upca_s'", "'upce_s'", "'upcd1'", "'upcd2'", "'upcd3'", "'upcd4'", "'upcd5'", "'ean8_s'", "'ean13_s'", "'ean128'", "'orca'", "'ocrb'", "'code128_parsed'", "'gs1databar'", "'gs1databar_e'", "'gs1databar_s'", "'gs1databar_e_s'", "'pdf417'", "'maxicode'", "'datamatrix'", "'qrcode'", "'uqrcode'", "'aztec'", "'updf417'", "'package'", "'{'", "'}'", "'statemachine'", "'initialState'", "'initialEvent'", "'functiongroup'", "'events'", "'controls'", "'states'", "'event'", "'state'", "'triggers'", "'keystroke'", "'@'", "'actions'", "'guards'", "'blinkRate'", "'clearDevice'", "'createWindow'", "'row'", "'column'", "'height'", "'width'", "'windowHeight'", "'windowWidth'", "'cursorType'", "'destroyWindow'", "'deviceBrightness'", "'displayBitmap'", "'id'", "'displayText'", "'text'", "'displayTextAt'", "'interCharacterWait'", "'marqueeFormat'", "'marqueeRepeatWait'", "'marqueeType'", "'marqueeUnitWait'", "'scroll'", "'openDrawer'", "'printBarcode'", "'data'", "'barcodeType'", "'printBitmap'", "'printCut'", "'printNormal'", "'registerBitmap'", "'name'", "'paymentOpen'", "'host'", "'port'", "'paymentClose'", "'paymentAcknowledge'", "'paymentReversal'", "'withPassword'", "'ofReceipt'", "'paymentRegistration'", "'configuration'", "'paymentAuthorization'", "'ofAmount'", "'paymentResponse'", "'from'", "'printReport'", "'operation'", "'('", "')'", "'guard'", "'caption'", "'description'", "'type'", "'function'", "'store'", "'with'", "'retrieve'", "'transition'", "'translate'", "'dto'", "'get'", "','", "'set'", "'clear'", "'remove'", "'visible'", "'invisible'", "'image'", "'search'", "'in'", "'schedule'", "'keypad'", "'fields'", "'dataProvider'", "'scheduler'", "'lineDisplay'", "'posPrinter'", "'cashDrawer'", "'payment'", "'peripheral'", "'button'", "'key'", "'field'", "'layout'", "'delay'", "'send'", "']'", "'#'", "'['", "'instanceof'", "'as'", "';'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'described by'", "'and'", "'onFail'", "'::'", "'?.'", "'|'", "'var'", "'true'"
+    };
+    public static final int T__144=144;
+    public static final int T__265=265;
+    public static final int T__143=143;
+    public static final int T__264=264;
+    public static final int T__146=146;
+    public static final int T__267=267;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__266=266;
+    public static final int T__140=140;
+    public static final int T__261=261;
+    public static final int T__260=260;
+    public static final int T__142=142;
+    public static final int T__263=263;
+    public static final int T__141=141;
+    public static final int T__262=262;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__258=258;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__257=257;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__259=259;
+    public static final int T__133=133;
+    public static final int T__254=254;
+    public static final int T__132=132;
+    public static final int T__253=253;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__256=256;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int T__255=255;
+    public static final int T__250=250;
+    public static final int RULE_ID=4;
+    public static final int T__131=131;
+    public static final int T__252=252;
+    public static final int T__130=130;
+    public static final int T__251=251;
+    public static final int RULE_INT=7;
+    public static final int T__66=66;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__247=247;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__246=246;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__249=249;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__248=248;
+    public static final int T__166=166;
+    public static final int T__165=165;
+    public static final int T__168=168;
+    public static final int T__167=167;
+    public static final int T__162=162;
+    public static final int T__161=161;
+    public static final int T__164=164;
+    public static final int T__163=163;
+    public static final int T__160=160;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__159=159;
+    public static final int T__30=30;
+    public static final int T__158=158;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__154=154;
+    public static final int T__157=157;
+    public static final int T__156=156;
+    public static final int T__151=151;
+    public static final int T__150=150;
+    public static final int T__153=153;
+    public static final int T__152=152;
+    public static final int T__270=270;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__269=269;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__268=268;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__100=100;
+    public static final int T__221=221;
+    public static final int T__220=220;
+    public static final int T__102=102;
+    public static final int T__223=223;
+    public static final int T__101=101;
+    public static final int T__222=222;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__218=218;
+    public static final int T__217=217;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__219=219;
+    public static final int T__214=214;
+    public static final int T__213=213;
+    public static final int T__216=216;
+    public static final int T__215=215;
+    public static final int T__210=210;
+    public static final int T__212=212;
+    public static final int T__211=211;
+    public static final int RULE_DECIMAL=8;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__207=207;
+    public static final int T__23=23;
+    public static final int T__206=206;
+    public static final int T__24=24;
+    public static final int T__209=209;
+    public static final int T__25=25;
+    public static final int T__208=208;
+    public static final int T__203=203;
+    public static final int T__202=202;
+    public static final int T__20=20;
+    public static final int T__205=205;
+    public static final int T__21=21;
+    public static final int T__204=204;
+    public static final int T__122=122;
+    public static final int T__243=243;
+    public static final int T__121=121;
+    public static final int T__242=242;
+    public static final int T__124=124;
+    public static final int T__245=245;
+    public static final int T__123=123;
+    public static final int T__244=244;
+    public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__119=119;
+    public static final int T__118=118;
+    public static final int T__239=239;
+    public static final int T__115=115;
+    public static final int T__236=236;
+    public static final int EOF=-1;
+    public static final int T__114=114;
+    public static final int T__235=235;
+    public static final int T__117=117;
+    public static final int T__238=238;
+    public static final int T__116=116;
+    public static final int T__237=237;
+    public static final int T__111=111;
+    public static final int T__232=232;
+    public static final int T__110=110;
+    public static final int T__231=231;
+    public static final int T__113=113;
+    public static final int T__234=234;
+    public static final int T__112=112;
+    public static final int T__233=233;
+    public static final int T__230=230;
+    public static final int T__108=108;
+    public static final int T__229=229;
+    public static final int T__107=107;
+    public static final int T__228=228;
+    public static final int T__109=109;
+    public static final int T__104=104;
+    public static final int T__225=225;
+    public static final int T__103=103;
+    public static final int T__224=224;
+    public static final int T__106=106;
+    public static final int T__227=227;
+    public static final int T__105=105;
+    public static final int T__226=226;
+    public static final int RULE_HEX=6;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__201=201;
+    public static final int T__200=200;
+    public static final int T__91=91;
+    public static final int T__188=188;
+    public static final int T__92=92;
+    public static final int T__187=187;
+    public static final int T__93=93;
+    public static final int T__94=94;
+    public static final int T__189=189;
+    public static final int T__184=184;
+    public static final int T__183=183;
+    public static final int T__186=186;
+    public static final int T__90=90;
+    public static final int T__185=185;
+    public static final int T__180=180;
+    public static final int T__182=182;
+    public static final int T__181=181;
+    public static final int T__99=99;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
+    public static final int T__169=169;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=5;
+    public static final int T__77=77;
+    public static final int T__78=78;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__74=74;
+    public static final int T__75=75;
+    public static final int T__76=76;
+    public static final int T__80=80;
+    public static final int T__199=199;
+    public static final int T__81=81;
+    public static final int T__198=198;
+    public static final int T__82=82;
+    public static final int T__83=83;
+    public static final int T__195=195;
+    public static final int T__194=194;
+    public static final int RULE_WS=11;
+    public static final int T__197=197;
+    public static final int T__196=196;
+    public static final int T__191=191;
+    public static final int T__190=190;
+    public static final int T__193=193;
+    public static final int T__192=192;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__89=89;
+    public static final int T__84=84;
+    public static final int T__85=85;
+    public static final int T__86=86;
+    public static final int T__87=87;
+
+
+    public String[] getTokenNames() { return InternalStatemachineDSLParser.tokenNames; }
+    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/antlr/internal/InternalStatemachineDSL.g"; }
+
+
+     
+     	protected StatemachineDSLGrammarAccess grammarAccess;
+     	
+        public void setGrammarAccess(StatemachineDSLGrammarAccess grammarAccess) {
+        	this.grammarAccess = grammarAccess;
+        }
+        
+        @Override
+        protected Grammar getGrammar() {
+        	return grammarAccess.getGrammar();
+        }
+        
+        @Override
+        protected String getValueForTokenName(String tokenName) {
+        	return tokenName;
+        }
+
+
+
+
+
+    // Delegated rules
+
+    public final boolean synpred298_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred298_InternalStatemachineDSL_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 synpred308_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred308_InternalStatemachineDSL_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 synpred337_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred337_InternalStatemachineDSL_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 synpred91_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred91_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred284_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred284_InternalStatemachineDSL_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 synpred343_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred343_InternalStatemachineDSL_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 synpred328_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred328_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred278_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred278_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred281_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred281_InternalStatemachineDSL_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 synpred65_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred65_InternalStatemachineDSL_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 synpred352_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred352_InternalStatemachineDSL_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 synpred305_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred305_InternalStatemachineDSL_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 synpred132_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred132_InternalStatemachineDSL_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 synpred357_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred357_InternalStatemachineDSL_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 synpred290_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred290_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred289_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred289_InternalStatemachineDSL_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 synpred334_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred334_InternalStatemachineDSL_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 synpred341_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred341_InternalStatemachineDSL_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 synpred114_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred114_InternalStatemachineDSL_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 synpred127_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred127_InternalStatemachineDSL_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 synpred326_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred326_InternalStatemachineDSL_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 synpred354_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred354_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred264_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred264_InternalStatemachineDSL_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 synpred359_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred359_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred282_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred282_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred287_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred287_InternalStatemachineDSL_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 synpred351_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred351_InternalStatemachineDSL_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 synpred131_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred131_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred279_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred279_InternalStatemachineDSL_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 synpred356_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred356_InternalStatemachineDSL_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 synpred333_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred333_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred113_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred113_InternalStatemachineDSL_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 synpred321_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred321_InternalStatemachineDSL_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 synpred344_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred344_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred285_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred285_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred280_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred280_InternalStatemachineDSL_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 synpred66_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred66_InternalStatemachineDSL_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 synpred353_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred353_InternalStatemachineDSL_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 synpred322_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred322_InternalStatemachineDSL_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 synpred358_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred358_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred283_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred283_InternalStatemachineDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred286_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred286_InternalStatemachineDSL_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 synpred276_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred276_InternalStatemachineDSL_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 synpred335_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred335_InternalStatemachineDSL_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 synpred138_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred138_InternalStatemachineDSL_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 synpred92_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred92_InternalStatemachineDSL_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 synpred105_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred105_InternalStatemachineDSL_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 synpred327_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred327_InternalStatemachineDSL_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 synpred355_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred355_InternalStatemachineDSL_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 synpred360_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred360_InternalStatemachineDSL_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 synpred64_InternalStatemachineDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred64_InternalStatemachineDSL_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 DFA5 dfa5 = new DFA5(this);
+    protected DFA8 dfa8 = new DFA8(this);
+    protected DFA9 dfa9 = new DFA9(this);
+    protected DFA10 dfa10 = new DFA10(this);
+    protected DFA17 dfa17 = new DFA17(this);
+    protected DFA25 dfa25 = new DFA25(this);
+    protected DFA28 dfa28 = new DFA28(this);
+    protected DFA29 dfa29 = new DFA29(this);
+    protected DFA32 dfa32 = new DFA32(this);
+    protected DFA37 dfa37 = new DFA37(this);
+    protected DFA40 dfa40 = new DFA40(this);
+    protected DFA49 dfa49 = new DFA49(this);
+    protected DFA108 dfa108 = new DFA108(this);
+    protected DFA114 dfa114 = new DFA114(this);
+    protected DFA121 dfa121 = new DFA121(this);
+    protected DFA122 dfa122 = new DFA122(this);
+    protected DFA130 dfa130 = new DFA130(this);
+    protected DFA140 dfa140 = new DFA140(this);
+    protected DFA153 dfa153 = new DFA153(this);
+    protected DFA154 dfa154 = new DFA154(this);
+    protected DFA158 dfa158 = new DFA158(this);
+    protected DFA159 dfa159 = new DFA159(this);
+    protected DFA160 dfa160 = new DFA160(this);
+    protected DFA165 dfa165 = new DFA165(this);
+    protected DFA173 dfa173 = new DFA173(this);
+    protected DFA176 dfa176 = new DFA176(this);
+    protected DFA188 dfa188 = new DFA188(this);
+    static final String DFA5_eotS =
+        "\12\uffff";
+    static final String DFA5_eofS =
+        "\12\uffff";
+    static final String DFA5_minS =
+        "\1\42\1\5\10\uffff";
+    static final String DFA5_maxS =
+        "\1\42\1\u00d3\10\uffff";
+    static final String DFA5_acceptS =
+        "\2\uffff\1\5\1\1\1\10\1\7\1\2\1\3\1\4\1\6";
+    static final String DFA5_specialS =
+        "\12\uffff}>";
+    static final String[] DFA5_transitionS = {
+            "\1\1",
+            "\1\3\1\uffff\1\6\33\uffff\1\6\31\uffff\16\7\172\uffff\1\11"+
+            "\11\uffff\1\5\1\uffff\1\10\1\4\1\2",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA5_eot = DFA.unpackEncodedString(DFA5_eotS);
+    static final short[] DFA5_eof = DFA.unpackEncodedString(DFA5_eofS);
+    static final char[] DFA5_min = DFA.unpackEncodedStringToUnsignedChars(DFA5_minS);
+    static final char[] DFA5_max = DFA.unpackEncodedStringToUnsignedChars(DFA5_maxS);
+    static final short[] DFA5_accept = DFA.unpackEncodedString(DFA5_acceptS);
+    static final short[] DFA5_special = DFA.unpackEncodedString(DFA5_specialS);
+    static final short[][] DFA5_transition;
+
+    static {
+        int numStates = DFA5_transitionS.length;
+        DFA5_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA5_transition[i] = DFA.unpackEncodedString(DFA5_transitionS[i]);
+        }
+    }
+
+    class DFA5 extends DFA {
+
+        public DFA5(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 5;
+            this.eot = DFA5_eot;
+            this.eof = DFA5_eof;
+            this.min = DFA5_min;
+            this.max = DFA5_max;
+            this.accept = DFA5_accept;
+            this.special = DFA5_special;
+            this.transition = DFA5_transition;
+        }
+        public String getDescription() {
+            return "5584:1: rule__StatemachineActionFieldSourceMore__Alternatives : ( ( ruleStatemachineActionFieldSourceStringMore ) | ( ruleStatemachineActionFieldSourceNumberMore ) | ( ruleStatemachineActionFieldSourceEvaluateMore ) | ( ruleStatemachineActionFieldSourceTranslateMore ) | ( ruleStatemachineActionFieldGetMore ) | ( ruleStatemachineOperationMore ) | ( ruleStatemachineStorageRetrieveMore ) | ( ruleStatemachineActionFieldSourceDtoAttributeMore ) );";
+        }
+    }
+    static final String DFA8_eotS =
+        "\43\uffff";
+    static final String DFA8_eofS =
+        "\43\uffff";
+    static final String DFA8_minS =
+        "\1\4\1\0\41\uffff";
+    static final String DFA8_maxS =
+        "\1\u010e\1\0\41\uffff";
+    static final String DFA8_acceptS =
+        "\2\uffff\1\2\37\uffff\1\1";
+    static final String DFA8_specialS =
+        "\1\uffff\1\0\41\uffff}>";
+    static final String[] DFA8_transitionS = {
+            "\1\1\4\2\22\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\123"+
+            "\uffff\1\2\14\uffff\1\2\62\uffff\1\2\47\uffff\2\2\3\uffff\1"+
+            "\2\1\uffff\1\2\3\uffff\11\2\1\uffff\1\2\12\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA8_eot = DFA.unpackEncodedString(DFA8_eotS);
+    static final short[] DFA8_eof = DFA.unpackEncodedString(DFA8_eofS);
+    static final char[] DFA8_min = DFA.unpackEncodedStringToUnsignedChars(DFA8_minS);
+    static final char[] DFA8_max = DFA.unpackEncodedStringToUnsignedChars(DFA8_maxS);
+    static final short[] DFA8_accept = DFA.unpackEncodedString(DFA8_acceptS);
+    static final short[] DFA8_special = DFA.unpackEncodedString(DFA8_specialS);
+    static final short[][] DFA8_transition;
+
+    static {
+        int numStates = DFA8_transitionS.length;
+        DFA8_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA8_transition[i] = DFA.unpackEncodedString(DFA8_transitionS[i]);
+        }
+    }
+
+    class DFA8 extends DFA {
+
+        public DFA8(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 8;
+            this.eot = DFA8_eot;
+            this.eof = DFA8_eof;
+            this.min = DFA8_min;
+            this.max = DFA8_max;
+            this.accept = DFA8_accept;
+            this.special = DFA8_special;
+            this.transition = DFA8_transition;
+        }
+        public String getDescription() {
+            return "5711:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA8_1 = input.LA(1);
+
+                         
+                        int index8_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred64_InternalStatemachineDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index8_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 8, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA9_eotS =
+        "\43\uffff";
+    static final String DFA9_eofS =
+        "\43\uffff";
+    static final String DFA9_minS =
+        "\1\4\1\0\41\uffff";
+    static final String DFA9_maxS =
+        "\1\u010e\1\0\41\uffff";
+    static final String DFA9_acceptS =
+        "\2\uffff\1\2\37\uffff\1\1";
+    static final String DFA9_specialS =
+        "\1\uffff\1\0\41\uffff}>";
+    static final String[] DFA9_transitionS = {
+            "\5\2\22\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\123\uffff"+
+            "\1\2\14\uffff\1\2\62\uffff\1\2\47\uffff\1\1\1\2\3\uffff\1\2"+
+            "\1\uffff\1\2\3\uffff\11\2\1\uffff\1\2\12\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA9_eot = DFA.unpackEncodedString(DFA9_eotS);
+    static final short[] DFA9_eof = DFA.unpackEncodedString(DFA9_eofS);
+    static final char[] DFA9_min = DFA.unpackEncodedStringToUnsignedChars(DFA9_minS);
+    static final char[] DFA9_max = DFA.unpackEncodedStringToUnsignedChars(DFA9_maxS);
+    static final short[] DFA9_accept = DFA.unpackEncodedString(DFA9_acceptS);
+    static final short[] DFA9_special = DFA.unpackEncodedString(DFA9_specialS);
+    static final short[][] DFA9_transition;
+
+    static {
+        int numStates = DFA9_transitionS.length;
+        DFA9_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA9_transition[i] = DFA.unpackEncodedString(DFA9_transitionS[i]);
+        }
+    }
+
+    class DFA9 extends DFA {
+
+        public DFA9(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 9;
+            this.eot = DFA9_eot;
+            this.eof = DFA9_eof;
+            this.min = DFA9_min;
+            this.max = DFA9_max;
+            this.accept = DFA9_accept;
+            this.special = DFA9_special;
+            this.transition = DFA9_transition;
+        }
+        public String getDescription() {
+            return "5733:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA9_1 = input.LA(1);
+
+                         
+                        int index9_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred65_InternalStatemachineDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index9_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 9, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA10_eotS =
+        "\43\uffff";
+    static final String DFA10_eofS =
+        "\43\uffff";
+    static final String DFA10_minS =
+        "\1\4\1\0\41\uffff";
+    static final String DFA10_maxS =
+        "\1\u010e\1\0\41\uffff";
+    static final String DFA10_acceptS =
+        "\2\uffff\1\2\37\uffff\1\1";
+    static final String DFA10_specialS =
+        "\1\uffff\1\0\41\uffff}>";
+    static final String[] DFA10_transitionS = {
+            "\5\2\22\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\123\uffff"+
+            "\1\2\14\uffff\1\2\62\uffff\1\2\47\uffff\1\1\1\2\3\uffff\1\2"+
+            "\1\uffff\1\2\3\uffff\11\2\1\uffff\1\2\12\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA10_eot = DFA.unpackEncodedString(DFA10_eotS);
+    static final short[] DFA10_eof = DFA.unpackEncodedString(DFA10_eofS);
+    static final char[] DFA10_min = DFA.unpackEncodedStringToUnsignedChars(DFA10_minS);
+    static final char[] DFA10_max = DFA.unpackEncodedStringToUnsignedChars(DFA10_maxS);
+    static final short[] DFA10_accept = DFA.unpackEncodedString(DFA10_acceptS);
+    static final short[] DFA10_special = DFA.unpackEncodedString(DFA10_specialS);
+    static final short[][] DFA10_transition;
+
+    static {
+        int numStates = DFA10_transitionS.length;
+        DFA10_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA10_transition[i] = DFA.unpackEncodedString(DFA10_transitionS[i]);
+        }
+    }
+
+    class DFA10 extends DFA {
+
+        public DFA10(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 10;
+            this.eot = DFA10_eot;
+            this.eof = DFA10_eof;
+            this.min = DFA10_min;
+            this.max = DFA10_max;
+            this.accept = DFA10_accept;
+            this.special = DFA10_special;
+            this.transition = DFA10_transition;
+        }
+        public String getDescription() {
+            return "5755:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA10_1 = input.LA(1);
+
+                         
+                        int index10_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred66_InternalStatemachineDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index10_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 10, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA17_eotS =
+        "\13\uffff";
+    static final String DFA17_eofS =
+        "\13\uffff";
+    static final String DFA17_minS =
+        "\1\32\2\uffff\1\32\7\uffff";
+    static final String DFA17_maxS =
+        "\1\41\2\uffff\1\36\7\uffff";
+    static final String DFA17_acceptS =
+        "\1\uffff\1\1\1\2\1\uffff\1\4\1\5\1\7\1\10\1\11\1\6\1\3";
+    static final String DFA17_specialS =
+        "\13\uffff}>";
+    static final String[] DFA17_transitionS = {
+            "\1\3\1\6\1\1\1\2\1\4\1\5\1\7\1\10",
+            "",
+            "",
+            "\1\11\3\uffff\1\12",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] 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 "5987:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );";
+        }
+    }
+    static final String DFA25_eotS =
+        "\12\uffff";
+    static final String DFA25_eofS =
+        "\4\uffff\5\3\1\uffff";
+    static final String DFA25_minS =
+        "\1\53\2\4\1\uffff\5\4\1\uffff";
+    static final String DFA25_maxS =
+        "\1\u010b\2\61\1\uffff\5\u010e\1\uffff";
+    static final String DFA25_acceptS =
+        "\3\uffff\1\2\5\uffff\1\1";
+    static final String DFA25_specialS =
+        "\12\uffff}>";
+    static final String[] DFA25_transitionS = {
+            "\1\1\u00de\uffff\1\2\1\3",
+            "\1\4\26\uffff\1\3\21\uffff\1\5\1\6\1\7\1\10\1\3",
+            "\1\4\26\uffff\1\3\21\uffff\1\5\1\6\1\7\1\10\1\3",
+            "",
+            "\5\3\4\uffff\1\11\45\3\123\uffff\2\3\76\uffff\2\3\14\uffff"+
+            "\1\3\30\uffff\30\3\5\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\123\uffff\2\3\76\uffff\2\3\14\uffff"+
+            "\1\3\30\uffff\30\3\5\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\123\uffff\2\3\76\uffff\2\3\14\uffff"+
+            "\1\3\30\uffff\30\3\5\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\123\uffff\2\3\76\uffff\2\3\14\uffff"+
+            "\1\3\30\uffff\30\3\5\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\123\uffff\2\3\76\uffff\2\3\14\uffff"+
+            "\1\3\30\uffff\30\3\5\uffff\2\3\1\uffff\2\3",
+            ""
+    };
+
+    static final short[] DFA25_eot = DFA.unpackEncodedString(DFA25_eotS);
+    static final short[] DFA25_eof = DFA.unpackEncodedString(DFA25_eofS);
+    static final char[] DFA25_min = DFA.unpackEncodedStringToUnsignedChars(DFA25_minS);
+    static final char[] DFA25_max = DFA.unpackEncodedStringToUnsignedChars(DFA25_maxS);
+    static final short[] DFA25_accept = DFA.unpackEncodedString(DFA25_acceptS);
+    static final short[] DFA25_special = DFA.unpackEncodedString(DFA25_specialS);
+    static final short[][] DFA25_transition;
+
+    static {
+        int numStates = DFA25_transitionS.length;
+        DFA25_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA25_transition[i] = DFA.unpackEncodedString(DFA25_transitionS[i]);
+        }
+    }
+
+    class DFA25 extends DFA {
+
+        public DFA25(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 25;
+            this.eot = DFA25_eot;
+            this.eof = DFA25_eof;
+            this.min = DFA25_min;
+            this.max = DFA25_max;
+            this.accept = DFA25_accept;
+            this.special = DFA25_special;
+            this.transition = DFA25_transition;
+        }
+        public String getDescription() {
+            return "6269:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );";
+        }
+    }
+    static final String DFA28_eotS =
+        "\43\uffff";
+    static final String DFA28_eofS =
+        "\43\uffff";
+    static final String DFA28_minS =
+        "\1\4\2\0\40\uffff";
+    static final String DFA28_maxS =
+        "\1\u010e\2\0\40\uffff";
+    static final String DFA28_acceptS =
+        "\3\uffff\1\1\1\uffff\1\2\35\uffff";
+    static final String DFA28_specialS =
+        "\1\uffff\1\0\1\1\40\uffff}>";
+    static final String[] DFA28_transitionS = {
+            "\1\1\4\5\22\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\4"+
+            "\uffff\6\5\123\uffff\1\5\77\uffff\1\2\47\uffff\2\5\3\uffff\1"+
+            "\5\1\uffff\1\5\3\uffff\11\5\1\uffff\1\5\10\uffff\1\3\1\uffff"+
+            "\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA28_eot = DFA.unpackEncodedString(DFA28_eotS);
+    static final short[] DFA28_eof = DFA.unpackEncodedString(DFA28_eofS);
+    static final char[] DFA28_min = DFA.unpackEncodedStringToUnsignedChars(DFA28_minS);
+    static final char[] DFA28_max = DFA.unpackEncodedStringToUnsignedChars(DFA28_maxS);
+    static final short[] DFA28_accept = DFA.unpackEncodedString(DFA28_acceptS);
+    static final short[] DFA28_special = DFA.unpackEncodedString(DFA28_specialS);
+    static final short[][] DFA28_transition;
+
+    static {
+        int numStates = DFA28_transitionS.length;
+        DFA28_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA28_transition[i] = DFA.unpackEncodedString(DFA28_transitionS[i]);
+        }
+    }
+
+    class DFA28 extends DFA {
+
+        public DFA28(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 28;
+            this.eot = DFA28_eot;
+            this.eof = DFA28_eof;
+            this.min = DFA28_min;
+            this.max = DFA28_max;
+            this.accept = DFA28_accept;
+            this.special = DFA28_special;
+            this.transition = DFA28_transition;
+        }
+        public String getDescription() {
+            return "6345:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA28_1 = input.LA(1);
+
+                         
+                        int index28_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred105_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index28_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA28_2 = input.LA(1);
+
+                         
+                        int index28_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred105_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index28_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 28, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA29_eotS =
+        "\40\uffff";
+    static final String DFA29_eofS =
+        "\40\uffff";
+    static final String DFA29_minS =
+        "\1\4\26\uffff\1\0\10\uffff";
+    static final String DFA29_maxS =
+        "\1\u010e\26\uffff\1\0\10\uffff";
+    static final String DFA29_acceptS =
+        "\1\uffff\1\1\1\2\1\3\1\4\1\5\6\uffff\1\6\11\uffff\1\7\1\uffff\1"+
+        "\12\1\13\1\14\1\15\1\16\1\17\1\10\1\11";
+    static final String DFA29_specialS =
+        "\27\uffff\1\0\10\uffff}>";
+    static final String[] DFA29_transitionS = {
+            "\1\5\4\14\22\uffff\1\5\21\uffff\5\5\1\14\123\uffff\1\2\77\uffff"+
+            "\1\35\47\uffff\2\14\3\uffff\1\26\1\uffff\1\3\3\uffff\1\27\1"+
+            "\30\1\31\1\1\2\14\1\32\1\33\1\34\1\uffff\1\4\12\uffff\1\14",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA29_eot = DFA.unpackEncodedString(DFA29_eotS);
+    static final short[] DFA29_eof = DFA.unpackEncodedString(DFA29_eofS);
+    static final char[] DFA29_min = DFA.unpackEncodedStringToUnsignedChars(DFA29_minS);
+    static final char[] DFA29_max = DFA.unpackEncodedStringToUnsignedChars(DFA29_maxS);
+    static final short[] DFA29_accept = DFA.unpackEncodedString(DFA29_acceptS);
+    static final short[] DFA29_special = DFA.unpackEncodedString(DFA29_specialS);
+    static final short[][] DFA29_transition;
+
+    static {
+        int numStates = DFA29_transitionS.length;
+        DFA29_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA29_transition[i] = DFA.unpackEncodedString(DFA29_transitionS[i]);
+        }
+    }
+
+    class DFA29 extends DFA {
+
+        public DFA29(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 29;
+            this.eot = DFA29_eot;
+            this.eof = DFA29_eof;
+            this.min = DFA29_min;
+            this.max = DFA29_max;
+            this.accept = DFA29_accept;
+            this.special = DFA29_special;
+            this.transition = DFA29_transition;
+        }
+        public String getDescription() {
+            return "6367:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA29_23 = input.LA(1);
+
+                         
+                        int index29_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalStatemachineDSL()) ) {s = 30;}
+
+                        else if ( (synpred114_InternalStatemachineDSL()) ) {s = 31;}
+
+                         
+                        input.seek(index29_23);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 29, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA32_eotS =
+        "\43\uffff";
+    static final String DFA32_eofS =
+        "\43\uffff";
+    static final String DFA32_minS =
+        "\1\4\1\0\41\uffff";
+    static final String DFA32_maxS =
+        "\1\u010e\1\0\41\uffff";
+    static final String DFA32_acceptS =
+        "\2\uffff\1\2\37\uffff\1\1";
+    static final String DFA32_specialS =
+        "\1\uffff\1\0\41\uffff}>";
+    static final String[] DFA32_transitionS = {
+            "\5\2\22\uffff\1\2\3\uffff\1\2\2\uffff\2\2\4\uffff\1\2\4\uffff"+
+            "\6\2\123\uffff\1\2\77\uffff\1\1\47\uffff\2\2\3\uffff\1\2\1\uffff"+
+            "\1\2\3\uffff\11\2\1\uffff\1\2\12\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA32_eot = DFA.unpackEncodedString(DFA32_eotS);
+    static final short[] DFA32_eof = DFA.unpackEncodedString(DFA32_eofS);
+    static final char[] DFA32_min = DFA.unpackEncodedStringToUnsignedChars(DFA32_minS);
+    static final char[] DFA32_max = DFA.unpackEncodedStringToUnsignedChars(DFA32_maxS);
+    static final short[] DFA32_accept = DFA.unpackEncodedString(DFA32_acceptS);
+    static final short[] DFA32_special = DFA.unpackEncodedString(DFA32_specialS);
+    static final short[][] DFA32_transition;
+
+    static {
+        int numStates = DFA32_transitionS.length;
+        DFA32_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA32_transition[i] = DFA.unpackEncodedString(DFA32_transitionS[i]);
+        }
+    }
+
+    class DFA32 extends DFA {
+
+        public DFA32(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 32;
+            this.eot = DFA32_eot;
+            this.eof = DFA32_eof;
+            this.min = DFA32_min;
+            this.max = DFA32_max;
+            this.accept = DFA32_accept;
+            this.special = DFA32_special;
+            this.transition = DFA32_transition;
+        }
+        public String getDescription() {
+            return "6541:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA32_1 = input.LA(1);
+
+                         
+                        int index32_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred127_InternalStatemachineDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index32_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 32, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA37_eotS =
+        "\43\uffff";
+    static final String DFA37_eofS =
+        "\43\uffff";
+    static final String DFA37_minS =
+        "\1\4\2\0\40\uffff";
+    static final String DFA37_maxS =
+        "\1\u010e\2\0\40\uffff";
+    static final String DFA37_acceptS =
+        "\3\uffff\1\1\1\uffff\1\2\35\uffff";
+    static final String DFA37_specialS =
+        "\1\uffff\1\0\1\1\40\uffff}>";
+    static final String[] DFA37_transitionS = {
+            "\1\1\4\5\22\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\4"+
+            "\uffff\6\5\123\uffff\1\5\77\uffff\1\2\47\uffff\2\5\3\uffff\1"+
+            "\5\1\uffff\1\5\3\uffff\11\5\1\uffff\1\5\10\uffff\1\3\1\uffff"+
+            "\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA37_eot = DFA.unpackEncodedString(DFA37_eotS);
+    static final short[] DFA37_eof = DFA.unpackEncodedString(DFA37_eofS);
+    static final char[] DFA37_min = DFA.unpackEncodedStringToUnsignedChars(DFA37_minS);
+    static final char[] DFA37_max = DFA.unpackEncodedStringToUnsignedChars(DFA37_maxS);
+    static final short[] DFA37_accept = DFA.unpackEncodedString(DFA37_acceptS);
+    static final short[] DFA37_special = DFA.unpackEncodedString(DFA37_specialS);
+    static final short[][] DFA37_transition;
+
+    static {
+        int numStates = DFA37_transitionS.length;
+        DFA37_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA37_transition[i] = DFA.unpackEncodedString(DFA37_transitionS[i]);
+        }
+    }
+
+    class DFA37 extends DFA {
+
+        public DFA37(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 37;
+            this.eot = DFA37_eot;
+            this.eof = DFA37_eof;
+            this.min = DFA37_min;
+            this.max = DFA37_max;
+            this.accept = DFA37_accept;
+            this.special = DFA37_special;
+            this.transition = DFA37_transition;
+        }
+        public String getDescription() {
+            return "6653:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA37_1 = input.LA(1);
+
+                         
+                        int index37_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred132_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index37_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA37_2 = input.LA(1);
+
+                         
+                        int index37_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred132_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index37_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 37, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA40_eotS =
+        "\43\uffff";
+    static final String DFA40_eofS =
+        "\43\uffff";
+    static final String DFA40_minS =
+        "\1\4\2\0\40\uffff";
+    static final String DFA40_maxS =
+        "\1\u010e\2\0\40\uffff";
+    static final String DFA40_acceptS =
+        "\3\uffff\1\1\1\uffff\1\2\35\uffff";
+    static final String DFA40_specialS =
+        "\1\uffff\1\0\1\1\40\uffff}>";
+    static final String[] DFA40_transitionS = {
+            "\1\1\4\5\22\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\4"+
+            "\uffff\6\5\123\uffff\1\5\77\uffff\1\2\47\uffff\2\5\3\uffff\1"+
+            "\5\1\uffff\1\5\3\uffff\11\5\1\uffff\1\5\10\uffff\1\3\1\uffff"+
+            "\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA40_eot = DFA.unpackEncodedString(DFA40_eotS);
+    static final short[] DFA40_eof = DFA.unpackEncodedString(DFA40_eofS);
+    static final char[] DFA40_min = DFA.unpackEncodedStringToUnsignedChars(DFA40_minS);
+    static final char[] DFA40_max = DFA.unpackEncodedStringToUnsignedChars(DFA40_maxS);
+    static final short[] DFA40_accept = DFA.unpackEncodedString(DFA40_acceptS);
+    static final short[] DFA40_special = DFA.unpackEncodedString(DFA40_specialS);
+    static final short[][] DFA40_transition;
+
+    static {
+        int numStates = DFA40_transitionS.length;
+        DFA40_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA40_transition[i] = DFA.unpackEncodedString(DFA40_transitionS[i]);
+        }
+    }
+
+    class DFA40 extends DFA {
+
+        public DFA40(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 40;
+            this.eot = DFA40_eot;
+            this.eof = DFA40_eof;
+            this.min = DFA40_min;
+            this.max = DFA40_max;
+            this.accept = DFA40_accept;
+            this.special = DFA40_special;
+            this.transition = DFA40_transition;
+        }
+        public String getDescription() {
+            return "6747:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA40_1 = input.LA(1);
+
+                         
+                        int index40_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred138_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index40_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA40_2 = input.LA(1);
+
+                         
+                        int index40_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred138_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index40_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 40, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA49_eotS =
+        "\7\uffff";
+    static final String DFA49_eofS =
+        "\2\uffff\1\4\3\uffff\1\4";
+    static final String DFA49_minS =
+        "\1\4\1\uffff\1\53\1\4\2\uffff\1\53";
+    static final String DFA49_maxS =
+        "\1\56\1\uffff\1\u00f2\1\44\2\uffff\1\u00f2";
+    static final String DFA49_acceptS =
+        "\1\uffff\1\1\2\uffff\1\2\1\3\1\uffff";
+    static final String DFA49_specialS =
+        "\7\uffff}>";
+    static final String[] DFA49_transitionS = {
+            "\1\2\51\uffff\1\1",
+            "",
+            "\1\3\u00c6\uffff\1\4",
+            "\1\6\37\uffff\1\5",
+            "",
+            "",
+            "\1\3\u00c6\uffff\1\4"
+    };
+
+    static final short[] DFA49_eot = DFA.unpackEncodedString(DFA49_eotS);
+    static final short[] DFA49_eof = DFA.unpackEncodedString(DFA49_eofS);
+    static final char[] DFA49_min = DFA.unpackEncodedStringToUnsignedChars(DFA49_minS);
+    static final char[] DFA49_max = DFA.unpackEncodedStringToUnsignedChars(DFA49_maxS);
+    static final short[] DFA49_accept = DFA.unpackEncodedString(DFA49_acceptS);
+    static final short[] DFA49_special = DFA.unpackEncodedString(DFA49_specialS);
+    static final short[][] DFA49_transition;
+
+    static {
+        int numStates = DFA49_transitionS.length;
+        DFA49_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA49_transition[i] = DFA.unpackEncodedString(DFA49_transitionS[i]);
+        }
+    }
+
+    class DFA49 extends DFA {
+
+        public DFA49(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 49;
+            this.eot = DFA49_eot;
+            this.eof = DFA49_eof;
+            this.min = DFA49_min;
+            this.max = DFA49_max;
+            this.accept = DFA49_accept;
+            this.special = DFA49_special;
+            this.transition = DFA49_transition;
+        }
+        public String getDescription() {
+            return "6947:1: rule__XImportDeclaration__Alternatives_1 : ( ( ( rule__XImportDeclaration__Group_1_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 ) ) );";
+        }
+    }
+    static final String DFA108_eotS =
+        "\12\uffff";
+    static final String DFA108_eofS =
+        "\1\10\11\uffff";
+    static final String DFA108_minS =
+        "\1\4\7\0\2\uffff";
+    static final String DFA108_maxS =
+        "\1\u010e\7\0\2\uffff";
+    static final String DFA108_acceptS =
+        "\10\uffff\1\2\1\1";
+    static final String DFA108_specialS =
+        "\1\uffff\1\2\1\0\1\5\1\4\1\3\1\6\1\1\2\uffff}>";
+    static final String[] DFA108_transitionS = {
+            "\5\10\5\uffff\2\10\1\1\1\2\1\3\1\4\1\5\5\10\1\7\1\6\27\10\123"+
+            "\uffff\2\10\76\uffff\2\10\14\uffff\1\10\30\uffff\30\10\5\uffff"+
+            "\2\10\1\uffff\2\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            ""
+    };
+
+    static final short[] DFA108_eot = DFA.unpackEncodedString(DFA108_eotS);
+    static final short[] DFA108_eof = DFA.unpackEncodedString(DFA108_eofS);
+    static final char[] DFA108_min = DFA.unpackEncodedStringToUnsignedChars(DFA108_minS);
+    static final char[] DFA108_max = DFA.unpackEncodedStringToUnsignedChars(DFA108_maxS);
+    static final short[] DFA108_accept = DFA.unpackEncodedString(DFA108_acceptS);
+    static final short[] DFA108_special = DFA.unpackEncodedString(DFA108_specialS);
+    static final short[][] DFA108_transition;
+
+    static {
+        int numStates = DFA108_transitionS.length;
+        DFA108_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA108_transition[i] = DFA.unpackEncodedString(DFA108_transitionS[i]);
+        }
+    }
+
+    class DFA108 extends DFA {
+
+        public DFA108(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 108;
+            this.eot = DFA108_eot;
+            this.eof = DFA108_eof;
+            this.min = DFA108_min;
+            this.max = DFA108_max;
+            this.accept = DFA108_accept;
+            this.special = DFA108_special;
+            this.transition = DFA108_transition;
+        }
+        public String getDescription() {
+            return "22820:1: ( rule__XAssignment__Group_1_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA108_2 = input.LA(1);
+
+                         
+                        int index108_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred276_InternalStatemachineDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index108_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA108_7 = input.LA(1);
+
+                         
+                        int index108_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred276_InternalStatemachineDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index108_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA108_1 = input.LA(1);
+
+                         
+                        int index108_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred276_InternalStatemachineDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index108_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA108_5 = input.LA(1);
+
+                         
+                        int index108_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred276_InternalStatemachineDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index108_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA108_4 = input.LA(1);
+
+                         
+                        int index108_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred276_InternalStatemachineDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index108_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA108_3 = input.LA(1);
+
+                         
+                        int index108_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred276_InternalStatemachineDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index108_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA108_6 = input.LA(1);
+
+                         
+                        int index108_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred276_InternalStatemachineDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index108_6);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 108, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA114_eotS =
+        "\13\uffff";
+    static final String DFA114_eofS =
+        "\1\1\12\uffff";
+    static final String DFA114_minS =
+        "\1\4\1\uffff\10\0\1\uffff";
+    static final String DFA114_maxS =
+        "\1\u010e\1\uffff\10\0\1\uffff";
+    static final String DFA114_acceptS =
+        "\1\uffff\1\2\10\uffff\1\1";
+    static final String DFA114_specialS =
+        "\2\uffff\1\6\1\5\1\0\1\3\1\2\1\7\1\1\1\4\1\uffff}>";
+    static final String[] DFA114_transitionS = {
+            "\5\1\5\uffff\14\1\1\3\1\2\1\4\1\5\1\6\1\7\1\10\1\11\21\1\123"+
+            "\uffff\2\1\76\uffff\2\1\14\uffff\1\1\30\uffff\30\1\5\uffff\2"+
+            "\1\1\uffff\2\1",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+
+    static final short[] DFA114_eot = DFA.unpackEncodedString(DFA114_eotS);
+    static final short[] DFA114_eof = DFA.unpackEncodedString(DFA114_eofS);
+    static final char[] DFA114_min = DFA.unpackEncodedStringToUnsignedChars(DFA114_minS);
+    static final char[] DFA114_max = DFA.unpackEncodedStringToUnsignedChars(DFA114_maxS);
+    static final short[] DFA114_accept = DFA.unpackEncodedString(DFA114_acceptS);
+    static final short[] DFA114_special = DFA.unpackEncodedString(DFA114_specialS);
+    static final short[][] DFA114_transition;
+
+    static {
+        int numStates = DFA114_transitionS.length;
+        DFA114_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA114_transition[i] = DFA.unpackEncodedString(DFA114_transitionS[i]);
+        }
+    }
+
+    class DFA114 extends DFA {
+
+        public DFA114(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 114;
+            this.eot = DFA114_eot;
+            this.eof = DFA114_eof;
+            this.min = DFA114_min;
+            this.max = DFA114_max;
+            this.accept = DFA114_accept;
+            this.special = DFA114_special;
+            this.transition = DFA114_transition;
+        }
+        public String getDescription() {
+            return "()* loopback of 24312:1: ( rule__XOtherOperatorExpression__Group_1__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA114_4 = input.LA(1);
+
+                         
+                        int index114_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred282_InternalStatemachineDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index114_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA114_8 = input.LA(1);
+
+                         
+                        int index114_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred282_InternalStatemachineDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index114_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA114_6 = input.LA(1);
+
+                         
+                        int index114_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred282_InternalStatemachineDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index114_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA114_5 = input.LA(1);
+
+                         
+                        int index114_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred282_InternalStatemachineDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index114_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA114_9 = input.LA(1);
+
+                         
+                        int index114_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred282_InternalStatemachineDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index114_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA114_3 = input.LA(1);
+
+                         
+                        int index114_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred282_InternalStatemachineDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index114_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA114_2 = input.LA(1);
+
+                         
+                        int index114_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred282_InternalStatemachineDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index114_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA114_7 = input.LA(1);
+
+                         
+                        int index114_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred282_InternalStatemachineDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index114_7);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 114, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA121_eotS =
+        "\116\uffff";
+    static final String DFA121_eofS =
+        "\1\2\115\uffff";
+    static final String DFA121_minS =
+        "\1\4\1\0\114\uffff";
+    static final String DFA121_maxS =
+        "\1\u010e\1\0\114\uffff";
+    static final String DFA121_acceptS =
+        "\2\uffff\1\2\112\uffff\1\1";
+    static final String DFA121_specialS =
+        "\1\uffff\1\0\114\uffff}>";
+    static final String[] DFA121_transitionS = {
+            "\5\2\5\uffff\45\2\123\uffff\2\2\76\uffff\1\1\1\2\14\uffff\1"+
+            "\2\30\uffff\30\2\5\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA121_eot = DFA.unpackEncodedString(DFA121_eotS);
+    static final short[] DFA121_eof = DFA.unpackEncodedString(DFA121_eofS);
+    static final char[] DFA121_min = DFA.unpackEncodedStringToUnsignedChars(DFA121_minS);
+    static final char[] DFA121_max = DFA.unpackEncodedStringToUnsignedChars(DFA121_maxS);
+    static final short[] DFA121_accept = DFA.unpackEncodedString(DFA121_acceptS);
+    static final short[] DFA121_special = DFA.unpackEncodedString(DFA121_specialS);
+    static final short[][] DFA121_transition;
+
+    static {
+        int numStates = DFA121_transitionS.length;
+        DFA121_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA121_transition[i] = DFA.unpackEncodedString(DFA121_transitionS[i]);
+        }
+    }
+
+    class DFA121 extends DFA {
+
+        public DFA121(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 121;
+            this.eot = DFA121_eot;
+            this.eof = DFA121_eof;
+            this.min = DFA121_min;
+            this.max = DFA121_max;
+            this.accept = DFA121_accept;
+            this.special = DFA121_special;
+            this.transition = DFA121_transition;
+        }
+        public String getDescription() {
+            return "26139:1: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA121_1 = input.LA(1);
+
+                         
+                        int index121_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred289_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index121_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 121, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA122_eotS =
+        "\116\uffff";
+    static final String DFA122_eofS =
+        "\1\2\115\uffff";
+    static final String DFA122_minS =
+        "\1\4\1\0\114\uffff";
+    static final String DFA122_maxS =
+        "\1\u010e\1\0\114\uffff";
+    static final String DFA122_acceptS =
+        "\2\uffff\1\2\112\uffff\1\1";
+    static final String DFA122_specialS =
+        "\1\uffff\1\0\114\uffff}>";
+    static final String[] DFA122_transitionS = {
+            "\5\2\5\uffff\45\2\123\uffff\2\2\76\uffff\2\2\14\uffff\1\2\30"+
+            "\uffff\2\2\1\1\25\2\5\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA122_eot = DFA.unpackEncodedString(DFA122_eotS);
+    static final short[] DFA122_eof = DFA.unpackEncodedString(DFA122_eofS);
+    static final char[] DFA122_min = DFA.unpackEncodedStringToUnsignedChars(DFA122_minS);
+    static final char[] DFA122_max = DFA.unpackEncodedStringToUnsignedChars(DFA122_maxS);
+    static final short[] DFA122_accept = DFA.unpackEncodedString(DFA122_acceptS);
+    static final short[] DFA122_special = DFA.unpackEncodedString(DFA122_specialS);
+    static final short[][] DFA122_transition;
+
+    static {
+        int numStates = DFA122_transitionS.length;
+        DFA122_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA122_transition[i] = DFA.unpackEncodedString(DFA122_transitionS[i]);
+        }
+    }
+
+    class DFA122 extends DFA {
+
+        public DFA122(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 122;
+            this.eot = DFA122_eot;
+            this.eof = DFA122_eof;
+            this.min = DFA122_min;
+            this.max = DFA122_max;
+            this.accept = DFA122_accept;
+            this.special = DFA122_special;
+            this.transition = DFA122_transition;
+        }
+        public String getDescription() {
+            return "26167:1: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA122_1 = input.LA(1);
+
+                         
+                        int index122_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred290_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index122_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 122, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA130_eotS =
+        "\46\uffff";
+    static final String DFA130_eofS =
+        "\46\uffff";
+    static final String DFA130_minS =
+        "\1\4\2\0\43\uffff";
+    static final String DFA130_maxS =
+        "\1\u010e\2\0\43\uffff";
+    static final String DFA130_acceptS =
+        "\3\uffff\1\1\1\uffff\1\2\40\uffff";
+    static final String DFA130_specialS =
+        "\1\uffff\1\0\1\1\43\uffff}>";
+    static final String[] DFA130_transitionS = {
+            "\1\1\4\5\22\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\3"+
+            "\uffff\7\5\123\uffff\1\5\77\uffff\1\2\46\uffff\3\5\3\uffff\1"+
+            "\5\1\uffff\1\5\3\uffff\11\5\1\uffff\1\5\10\uffff\1\3\2\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA130_eot = DFA.unpackEncodedString(DFA130_eotS);
+    static final short[] DFA130_eof = DFA.unpackEncodedString(DFA130_eofS);
+    static final char[] DFA130_min = DFA.unpackEncodedStringToUnsignedChars(DFA130_minS);
+    static final char[] DFA130_max = DFA.unpackEncodedStringToUnsignedChars(DFA130_maxS);
+    static final short[] DFA130_accept = DFA.unpackEncodedString(DFA130_acceptS);
+    static final short[] DFA130_special = DFA.unpackEncodedString(DFA130_specialS);
+    static final short[][] DFA130_transition;
+
+    static {
+        int numStates = DFA130_transitionS.length;
+        DFA130_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA130_transition[i] = DFA.unpackEncodedString(DFA130_transitionS[i]);
+        }
+    }
+
+    class DFA130 extends DFA {
+
+        public DFA130(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 130;
+            this.eot = DFA130_eot;
+            this.eof = DFA130_eof;
+            this.min = DFA130_min;
+            this.max = DFA130_max;
+            this.accept = DFA130_accept;
+            this.special = DFA130_special;
+            this.transition = DFA130_transition;
+        }
+        public String getDescription() {
+            return "27308:1: ( rule__XClosure__Group_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA130_1 = input.LA(1);
+
+                         
+                        int index130_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred298_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index130_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA130_2 = input.LA(1);
+
+                         
+                        int index130_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred298_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index130_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 130, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA140_eotS =
+        "\42\uffff";
+    static final String DFA140_eofS =
+        "\42\uffff";
+    static final String DFA140_minS =
+        "\1\4\2\0\37\uffff";
+    static final String DFA140_maxS =
+        "\1\u010e\2\0\37\uffff";
+    static final String DFA140_acceptS =
+        "\3\uffff\1\1\1\2\35\uffff";
+    static final String DFA140_specialS =
+        "\1\uffff\1\0\1\1\37\uffff}>";
+    static final String[] DFA140_transitionS = {
+            "\1\1\4\4\22\uffff\1\4\3\uffff\1\3\2\uffff\2\4\4\uffff\1\4\4"+
+            "\uffff\6\4\123\uffff\1\4\77\uffff\1\2\47\uffff\2\4\3\uffff\1"+
+            "\4\1\uffff\1\4\3\uffff\11\4\1\uffff\1\4\12\uffff\1\4",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA140_eot = DFA.unpackEncodedString(DFA140_eotS);
+    static final short[] DFA140_eof = DFA.unpackEncodedString(DFA140_eofS);
+    static final char[] DFA140_min = DFA.unpackEncodedStringToUnsignedChars(DFA140_minS);
+    static final char[] DFA140_max = DFA.unpackEncodedStringToUnsignedChars(DFA140_maxS);
+    static final short[] DFA140_accept = DFA.unpackEncodedString(DFA140_acceptS);
+    static final short[] DFA140_special = DFA.unpackEncodedString(DFA140_specialS);
+    static final short[][] DFA140_transition;
+
+    static {
+        int numStates = DFA140_transitionS.length;
+        DFA140_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA140_transition[i] = DFA.unpackEncodedString(DFA140_transitionS[i]);
+        }
+    }
+
+    class DFA140 extends DFA {
+
+        public DFA140(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 140;
+            this.eot = DFA140_eot;
+            this.eof = DFA140_eof;
+            this.min = DFA140_min;
+            this.max = DFA140_max;
+            this.accept = DFA140_accept;
+            this.special = DFA140_special;
+            this.transition = DFA140_transition;
+        }
+        public String getDescription() {
+            return "28976:1: ( rule__XSwitchExpression__Group_2_1_0__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA140_1 = input.LA(1);
+
+                         
+                        int index140_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred308_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index140_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA140_2 = input.LA(1);
+
+                         
+                        int index140_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred308_InternalStatemachineDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index140_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 140, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA153_eotS =
+        "\116\uffff";
+    static final String DFA153_eofS =
+        "\1\2\115\uffff";
+    static final String DFA153_minS =
+        "\1\4\1\0\114\uffff";
+    static final String DFA153_maxS =
+        "\1\u010e\1\0\114\uffff";
+    static final String DFA153_acceptS =
+        "\2\uffff\1\2\112\uffff\1\1";
+    static final String DFA153_specialS =
+        "\1\uffff\1\0\114\uffff}>";
+    static final String[] DFA153_transitionS = {
+            "\5\2\5\uffff\45\2\123\uffff\2\2\76\uffff\1\1\1\2\14\uffff\1"+
+            "\2\30\uffff\30\2\5\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA153_eot = DFA.unpackEncodedString(DFA153_eotS);
+    static final short[] DFA153_eof = DFA.unpackEncodedString(DFA153_eofS);
+    static final char[] DFA153_min = DFA.unpackEncodedStringToUnsignedChars(DFA153_minS);
+    static final char[] DFA153_max = DFA.unpackEncodedStringToUnsignedChars(DFA153_maxS);
+    static final short[] DFA153_accept = DFA.unpackEncodedString(DFA153_acceptS);
+    static final short[] DFA153_special = DFA.unpackEncodedString(DFA153_specialS);
+    static final short[][] DFA153_transition;
+
+    static {
+        int numStates = DFA153_transitionS.length;
+        DFA153_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA153_transition[i] = DFA.unpackEncodedString(DFA153_transitionS[i]);
+        }
+    }
+
+    class DFA153 extends DFA {
+
+        public DFA153(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 153;
+            this.eot = DFA153_eot;
+            this.eof = DFA153_eof;
+            this.min = DFA153_min;
+            this.max = DFA153_max;
+            this.accept = DFA153_accept;
+            this.special = DFA153_special;
+            this.transition = DFA153_transition;
+        }
+        public String getDescription() {
+            return "31464:1: ( rule__XFeatureCall__Group_3__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA153_1 = input.LA(1);
+
+                         
+                        int index153_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred321_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index153_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 153, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA154_eotS =
+        "\116\uffff";
+    static final String DFA154_eofS =
+        "\1\2\115\uffff";
+    static final String DFA154_minS =
+        "\1\4\1\0\114\uffff";
+    static final String DFA154_maxS =
+        "\1\u010e\1\0\114\uffff";
+    static final String DFA154_acceptS =
+        "\2\uffff\1\2\112\uffff\1\1";
+    static final String DFA154_specialS =
+        "\1\uffff\1\0\114\uffff}>";
+    static final String[] DFA154_transitionS = {
+            "\5\2\5\uffff\45\2\123\uffff\2\2\76\uffff\2\2\14\uffff\1\2\30"+
+            "\uffff\2\2\1\1\25\2\5\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA154_eot = DFA.unpackEncodedString(DFA154_eotS);
+    static final short[] DFA154_eof = DFA.unpackEncodedString(DFA154_eofS);
+    static final char[] DFA154_min = DFA.unpackEncodedStringToUnsignedChars(DFA154_minS);
+    static final char[] DFA154_max = DFA.unpackEncodedStringToUnsignedChars(DFA154_maxS);
+    static final short[] DFA154_accept = DFA.unpackEncodedString(DFA154_acceptS);
+    static final short[] DFA154_special = DFA.unpackEncodedString(DFA154_specialS);
+    static final short[][] DFA154_transition;
+
+    static {
+        int numStates = DFA154_transitionS.length;
+        DFA154_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA154_transition[i] = DFA.unpackEncodedString(DFA154_transitionS[i]);
+        }
+    }
+
+    class DFA154 extends DFA {
+
+        public DFA154(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 154;
+            this.eot = DFA154_eot;
+            this.eof = DFA154_eof;
+            this.min = DFA154_min;
+            this.max = DFA154_max;
+            this.accept = DFA154_accept;
+            this.special = DFA154_special;
+            this.transition = DFA154_transition;
+        }
+        public String getDescription() {
+            return "31492:1: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA154_1 = input.LA(1);
+
+                         
+                        int index154_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred322_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index154_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 154, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA158_eotS =
+        "\116\uffff";
+    static final String DFA158_eofS =
+        "\1\2\115\uffff";
+    static final String DFA158_minS =
+        "\1\4\1\0\114\uffff";
+    static final String DFA158_maxS =
+        "\1\u010e\1\0\114\uffff";
+    static final String DFA158_acceptS =
+        "\2\uffff\1\2\112\uffff\1\1";
+    static final String DFA158_specialS =
+        "\1\uffff\1\0\114\uffff}>";
+    static final String[] DFA158_transitionS = {
+            "\5\2\5\uffff\15\2\1\1\27\2\123\uffff\2\2\76\uffff\2\2\14\uffff"+
+            "\1\2\30\uffff\30\2\5\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA158_eot = DFA.unpackEncodedString(DFA158_eotS);
+    static final short[] DFA158_eof = DFA.unpackEncodedString(DFA158_eofS);
+    static final char[] DFA158_min = DFA.unpackEncodedStringToUnsignedChars(DFA158_minS);
+    static final char[] DFA158_max = DFA.unpackEncodedStringToUnsignedChars(DFA158_maxS);
+    static final short[] DFA158_accept = DFA.unpackEncodedString(DFA158_acceptS);
+    static final short[] DFA158_special = DFA.unpackEncodedString(DFA158_specialS);
+    static final short[][] DFA158_transition;
+
+    static {
+        int numStates = DFA158_transitionS.length;
+        DFA158_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA158_transition[i] = DFA.unpackEncodedString(DFA158_transitionS[i]);
+        }
+    }
+
+    class DFA158 extends DFA {
+
+        public DFA158(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 158;
+            this.eot = DFA158_eot;
+            this.eof = DFA158_eof;
+            this.min = DFA158_min;
+            this.max = DFA158_max;
+            this.accept = DFA158_accept;
+            this.special = DFA158_special;
+            this.transition = DFA158_transition;
+        }
+        public String getDescription() {
+            return "32030:1: ( rule__XConstructorCall__Group_3__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA158_1 = input.LA(1);
+
+                         
+                        int index158_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred326_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index158_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 158, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA159_eotS =
+        "\116\uffff";
+    static final String DFA159_eofS =
+        "\1\2\115\uffff";
+    static final String DFA159_minS =
+        "\1\4\1\0\114\uffff";
+    static final String DFA159_maxS =
+        "\1\u010e\1\0\114\uffff";
+    static final String DFA159_acceptS =
+        "\2\uffff\1\2\112\uffff\1\1";
+    static final String DFA159_specialS =
+        "\1\uffff\1\0\114\uffff}>";
+    static final String[] DFA159_transitionS = {
+            "\5\2\5\uffff\45\2\123\uffff\2\2\76\uffff\1\1\1\2\14\uffff\1"+
+            "\2\30\uffff\30\2\5\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA159_eot = DFA.unpackEncodedString(DFA159_eotS);
+    static final short[] DFA159_eof = DFA.unpackEncodedString(DFA159_eofS);
+    static final char[] DFA159_min = DFA.unpackEncodedStringToUnsignedChars(DFA159_minS);
+    static final char[] DFA159_max = DFA.unpackEncodedStringToUnsignedChars(DFA159_maxS);
+    static final short[] DFA159_accept = DFA.unpackEncodedString(DFA159_acceptS);
+    static final short[] DFA159_special = DFA.unpackEncodedString(DFA159_specialS);
+    static final short[][] DFA159_transition;
+
+    static {
+        int numStates = DFA159_transitionS.length;
+        DFA159_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA159_transition[i] = DFA.unpackEncodedString(DFA159_transitionS[i]);
+        }
+    }
+
+    class DFA159 extends DFA {
+
+        public DFA159(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 159;
+            this.eot = DFA159_eot;
+            this.eof = DFA159_eof;
+            this.min = DFA159_min;
+            this.max = DFA159_max;
+            this.accept = DFA159_accept;
+            this.special = DFA159_special;
+            this.transition = DFA159_transition;
+        }
+        public String getDescription() {
+            return "32059:1: ( rule__XConstructorCall__Group_4__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA159_1 = input.LA(1);
+
+                         
+                        int index159_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred327_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index159_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 159, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA160_eotS =
+        "\116\uffff";
+    static final String DFA160_eofS =
+        "\1\2\115\uffff";
+    static final String DFA160_minS =
+        "\1\4\1\0\114\uffff";
+    static final String DFA160_maxS =
+        "\1\u010e\1\0\114\uffff";
+    static final String DFA160_acceptS =
+        "\2\uffff\1\2\112\uffff\1\1";
+    static final String DFA160_specialS =
+        "\1\uffff\1\0\114\uffff}>";
+    static final String[] DFA160_transitionS = {
+            "\5\2\5\uffff\45\2\123\uffff\2\2\76\uffff\2\2\14\uffff\1\2\30"+
+            "\uffff\2\2\1\1\25\2\5\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA160_eot = DFA.unpackEncodedString(DFA160_eotS);
+    static final short[] DFA160_eof = DFA.unpackEncodedString(DFA160_eofS);
+    static final char[] DFA160_min = DFA.unpackEncodedStringToUnsignedChars(DFA160_minS);
+    static final char[] DFA160_max = DFA.unpackEncodedStringToUnsignedChars(DFA160_maxS);
+    static final short[] DFA160_accept = DFA.unpackEncodedString(DFA160_acceptS);
+    static final short[] DFA160_special = DFA.unpackEncodedString(DFA160_specialS);
+    static final short[][] DFA160_transition;
+
+    static {
+        int numStates = DFA160_transitionS.length;
+        DFA160_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA160_transition[i] = DFA.unpackEncodedString(DFA160_transitionS[i]);
+        }
+    }
+
+    class DFA160 extends DFA {
+
+        public DFA160(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 160;
+            this.eot = DFA160_eot;
+            this.eof = DFA160_eof;
+            this.min = DFA160_min;
+            this.max = DFA160_max;
+            this.accept = DFA160_accept;
+            this.special = DFA160_special;
+            this.transition = DFA160_transition;
+        }
+        public String getDescription() {
+            return "32087:1: ( rule__XConstructorCall__ArgumentsAssignment_5 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA160_1 = input.LA(1);
+
+                         
+                        int index160_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred328_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index160_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 160, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA165_eotS =
+        "\116\uffff";
+    static final String DFA165_eofS =
+        "\1\41\115\uffff";
+    static final String DFA165_minS =
+        "\1\4\40\0\55\uffff";
+    static final String DFA165_maxS =
+        "\1\u010e\40\0\55\uffff";
+    static final String DFA165_acceptS =
+        "\41\uffff\1\2\53\uffff\1\1";
+    static final String DFA165_specialS =
+        "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1"+
+        "\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30"+
+        "\1\31\1\32\1\33\1\34\1\35\1\36\1\37\55\uffff}>";
+    static final String[] DFA165_transitionS = {
+            "\1\1\1\27\1\23\1\24\1\25\5\uffff\15\41\1\15\6\41\1\10\1\7\4"+
+            "\41\1\6\4\41\1\2\1\3\1\4\1\5\1\16\1\21\123\uffff\1\12\1\41\76"+
+            "\uffff\1\40\1\41\14\uffff\1\41\30\uffff\1\41\1\17\1\20\3\41"+
+            "\1\31\1\41\1\13\3\41\1\32\1\33\1\34\1\11\1\26\1\30\1\35\1\36"+
+            "\1\37\1\41\1\14\1\41\5\uffff\2\41\1\uffff\1\41\1\22",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA165_eot = DFA.unpackEncodedString(DFA165_eotS);
+    static final short[] DFA165_eof = DFA.unpackEncodedString(DFA165_eofS);
+    static final char[] DFA165_min = DFA.unpackEncodedStringToUnsignedChars(DFA165_minS);
+    static final char[] DFA165_max = DFA.unpackEncodedStringToUnsignedChars(DFA165_maxS);
+    static final short[] DFA165_accept = DFA.unpackEncodedString(DFA165_acceptS);
+    static final short[] DFA165_special = DFA.unpackEncodedString(DFA165_specialS);
+    static final short[][] DFA165_transition;
+
+    static {
+        int numStates = DFA165_transitionS.length;
+        DFA165_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA165_transition[i] = DFA.unpackEncodedString(DFA165_transitionS[i]);
+        }
+    }
+
+    class DFA165 extends DFA {
+
+        public DFA165(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 165;
+            this.eot = DFA165_eot;
+            this.eof = DFA165_eof;
+            this.min = DFA165_min;
+            this.max = DFA165_max;
+            this.accept = DFA165_accept;
+            this.special = DFA165_special;
+            this.transition = DFA165_transition;
+        }
+        public String getDescription() {
+            return "33140:1: ( rule__XReturnExpression__ExpressionAssignment_2 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA165_1 = input.LA(1);
+
+                         
+                        int index165_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA165_2 = input.LA(1);
+
+                         
+                        int index165_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA165_3 = input.LA(1);
+
+                         
+                        int index165_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA165_4 = input.LA(1);
+
+                         
+                        int index165_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA165_5 = input.LA(1);
+
+                         
+                        int index165_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA165_6 = input.LA(1);
+
+                         
+                        int index165_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA165_7 = input.LA(1);
+
+                         
+                        int index165_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA165_8 = input.LA(1);
+
+                         
+                        int index165_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA165_9 = input.LA(1);
+
+                         
+                        int index165_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA165_10 = input.LA(1);
+
+                         
+                        int index165_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA165_11 = input.LA(1);
+
+                         
+                        int index165_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA165_12 = input.LA(1);
+
+                         
+                        int index165_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA165_13 = input.LA(1);
+
+                         
+                        int index165_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 13 : 
+                        int LA165_14 = input.LA(1);
+
+                         
+                        int index165_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 14 : 
+                        int LA165_15 = input.LA(1);
+
+                         
+                        int index165_15 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_15);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 15 : 
+                        int LA165_16 = input.LA(1);
+
+                         
+                        int index165_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 16 : 
+                        int LA165_17 = input.LA(1);
+
+                         
+                        int index165_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 17 : 
+                        int LA165_18 = input.LA(1);
+
+                         
+                        int index165_18 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_18);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 18 : 
+                        int LA165_19 = input.LA(1);
+
+                         
+                        int index165_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 19 : 
+                        int LA165_20 = input.LA(1);
+
+                         
+                        int index165_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 20 : 
+                        int LA165_21 = input.LA(1);
+
+                         
+                        int index165_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 21 : 
+                        int LA165_22 = input.LA(1);
+
+                         
+                        int index165_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 22 : 
+                        int LA165_23 = input.LA(1);
+
+                         
+                        int index165_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_23);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 23 : 
+                        int LA165_24 = input.LA(1);
+
+                         
+                        int index165_24 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_24);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 24 : 
+                        int LA165_25 = input.LA(1);
+
+                         
+                        int index165_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 25 : 
+                        int LA165_26 = input.LA(1);
+
+                         
+                        int index165_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 26 : 
+                        int LA165_27 = input.LA(1);
+
+                         
+                        int index165_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_27);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 27 : 
+                        int LA165_28 = input.LA(1);
+
+                         
+                        int index165_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 28 : 
+                        int LA165_29 = input.LA(1);
+
+                         
+                        int index165_29 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_29);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 29 : 
+                        int LA165_30 = input.LA(1);
+
+                         
+                        int index165_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_30);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 30 : 
+                        int LA165_31 = input.LA(1);
+
+                         
+                        int index165_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_31);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 31 : 
+                        int LA165_32 = input.LA(1);
+
+                         
+                        int index165_32 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred333_InternalStatemachineDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index165_32);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 165, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA173_eotS =
+        "\117\uffff";
+    static final String DFA173_eofS =
+        "\1\2\116\uffff";
+    static final String DFA173_minS =
+        "\1\4\1\0\115\uffff";
+    static final String DFA173_maxS =
+        "\1\u010e\1\0\115\uffff";
+    static final String DFA173_acceptS =
+        "\2\uffff\1\2\113\uffff\1\1";
+    static final String DFA173_specialS =
+        "\1\uffff\1\0\115\uffff}>";
+    static final String[] DFA173_transitionS = {
+            "\5\2\5\uffff\15\2\1\1\27\2\123\uffff\2\2\76\uffff\2\2\14\uffff"+
+            "\1\2\30\uffff\30\2\1\uffff\1\2\3\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA173_eot = DFA.unpackEncodedString(DFA173_eotS);
+    static final short[] DFA173_eof = DFA.unpackEncodedString(DFA173_eofS);
+    static final char[] DFA173_min = DFA.unpackEncodedStringToUnsignedChars(DFA173_minS);
+    static final char[] DFA173_max = DFA.unpackEncodedStringToUnsignedChars(DFA173_maxS);
+    static final short[] DFA173_accept = DFA.unpackEncodedString(DFA173_acceptS);
+    static final short[] DFA173_special = DFA.unpackEncodedString(DFA173_specialS);
+    static final short[][] DFA173_transition;
+
+    static {
+        int numStates = DFA173_transitionS.length;
+        DFA173_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA173_transition[i] = DFA.unpackEncodedString(DFA173_transitionS[i]);
+        }
+    }
+
+    class DFA173 extends DFA {
+
+        public DFA173(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 173;
+            this.eot = DFA173_eot;
+            this.eof = DFA173_eof;
+            this.min = DFA173_min;
+            this.max = DFA173_max;
+            this.accept = DFA173_accept;
+            this.special = DFA173_special;
+            this.transition = DFA173_transition;
+        }
+        public String getDescription() {
+            return "34595:1: ( rule__JvmParameterizedTypeReference__Group_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA173_1 = input.LA(1);
+
+                         
+                        int index173_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred341_InternalStatemachineDSL()) ) {s = 78;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index173_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 173, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA176_eotS =
+        "\117\uffff";
+    static final String DFA176_eofS =
+        "\1\2\116\uffff";
+    static final String DFA176_minS =
+        "\1\4\1\0\115\uffff";
+    static final String DFA176_maxS =
+        "\1\u010e\1\0\115\uffff";
+    static final String DFA176_acceptS =
+        "\2\uffff\1\2\113\uffff\1\1";
+    static final String DFA176_specialS =
+        "\1\uffff\1\0\115\uffff}>";
+    static final String[] DFA176_transitionS = {
+            "\5\2\5\uffff\15\2\1\1\27\2\123\uffff\2\2\76\uffff\2\2\14\uffff"+
+            "\1\2\30\uffff\30\2\1\uffff\1\2\3\uffff\2\2\1\uffff\2\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA176_eot = DFA.unpackEncodedString(DFA176_eotS);
+    static final short[] DFA176_eof = DFA.unpackEncodedString(DFA176_eofS);
+    static final char[] DFA176_min = DFA.unpackEncodedStringToUnsignedChars(DFA176_minS);
+    static final char[] DFA176_max = DFA.unpackEncodedStringToUnsignedChars(DFA176_maxS);
+    static final short[] DFA176_accept = DFA.unpackEncodedString(DFA176_acceptS);
+    static final short[] DFA176_special = DFA.unpackEncodedString(DFA176_specialS);
+    static final short[][] DFA176_transition;
+
+    static {
+        int numStates = DFA176_transitionS.length;
+        DFA176_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA176_transition[i] = DFA.unpackEncodedString(DFA176_transitionS[i]);
+        }
+    }
+
+    class DFA176 extends DFA {
+
+        public DFA176(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 176;
+            this.eot = DFA176_eot;
+            this.eof = DFA176_eof;
+            this.min = DFA176_min;
+            this.max = DFA176_max;
+            this.accept = DFA176_accept;
+            this.special = DFA176_special;
+            this.transition = DFA176_transition;
+        }
+        public String getDescription() {
+            return "34906:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA176_1 = input.LA(1);
+
+                         
+                        int index176_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred344_InternalStatemachineDSL()) ) {s = 78;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index176_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 176, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA188_eotS =
+        "\15\uffff";
+    static final String DFA188_eofS =
+        "\1\2\14\uffff";
+    static final String DFA188_minS =
+        "\1\u0087\1\4\1\uffff\1\u00cb\1\63\7\0\1\uffff";
+    static final String DFA188_maxS =
+        "\1\u00ea\1\4\1\uffff\1\u00cb\1\71\7\0\1\uffff";
+    static final String DFA188_acceptS =
+        "\2\uffff\1\2\11\uffff\1\1";
+    static final String DFA188_specialS =
+        "\5\uffff\1\2\1\4\1\0\1\1\1\3\1\5\1\6\1\uffff}>";
+    static final String[] DFA188_transitionS = {
+            "\1\2\141\uffff\1\1\1\2",
+            "\1\3",
+            "",
+            "\1\4",
+            "\1\5\1\6\1\7\1\10\1\11\1\12\1\13",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+
+    static final short[] DFA188_eot = DFA.unpackEncodedString(DFA188_eotS);
+    static final short[] DFA188_eof = DFA.unpackEncodedString(DFA188_eofS);
+    static final char[] DFA188_min = DFA.unpackEncodedStringToUnsignedChars(DFA188_minS);
+    static final char[] DFA188_max = DFA.unpackEncodedStringToUnsignedChars(DFA188_maxS);
+    static final short[] DFA188_accept = DFA.unpackEncodedString(DFA188_acceptS);
+    static final short[] DFA188_special = DFA.unpackEncodedString(DFA188_specialS);
+    static final short[][] DFA188_transition;
+
+    static {
+        int numStates = DFA188_transitionS.length;
+        DFA188_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA188_transition[i] = DFA.unpackEncodedString(DFA188_transitionS[i]);
+        }
+    }
+
+    class DFA188 extends DFA {
+
+        public DFA188(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 188;
+            this.eot = DFA188_eot;
+            this.eof = DFA188_eof;
+            this.min = DFA188_min;
+            this.max = DFA188_max;
+            this.accept = DFA188_accept;
+            this.special = DFA188_special;
+            this.transition = DFA188_transition;
+        }
+        public String getDescription() {
+            return "()* loopback of 36226:7: ( ( rule__StatemachineControlField__FieldsAssignment_3_0 )=> rule__StatemachineControlField__FieldsAssignment_3_0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA188_7 = input.LA(1);
+
+                         
+                        int index188_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred357_InternalStatemachineDSL()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index188_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA188_8 = input.LA(1);
+
+                         
+                        int index188_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred357_InternalStatemachineDSL()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index188_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA188_5 = input.LA(1);
+
+                         
+                        int index188_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred357_InternalStatemachineDSL()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index188_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA188_9 = input.LA(1);
+
+                         
+                        int index188_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred357_InternalStatemachineDSL()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index188_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA188_6 = input.LA(1);
+
+                         
+                        int index188_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred357_InternalStatemachineDSL()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index188_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA188_10 = input.LA(1);
+
+                         
+                        int index188_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred357_InternalStatemachineDSL()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index188_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA188_11 = input.LA(1);
+
+                         
+                        int index188_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred357_InternalStatemachineDSL()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index188_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 188, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+    
+    protected static class FollowSets000 {
+        public static final BitSet FOLLOW_ruleStatemachineModel_in_entryRuleStatemachineModel67 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineModel74 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineModel__PackagesAssignment_in_ruleStatemachineModel100 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000020L});
+        public static final BitSet FOLLOW_ruleStatemachinePackage_in_entryRuleStatemachinePackage128 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachinePackage135 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group__0_in_ruleStatemachinePackage161 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachine_in_entryRuleStatemachine188 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachine195 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__0_in_ruleStatemachine221 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineEvent_in_entryRuleStatemachineEvent248 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineEvent255 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineEvent__Group__0_in_ruleStatemachineEvent281 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineState_in_entryRuleStatemachineState308 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineState315 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__0_in_ruleStatemachineState341 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineTrigger_in_entryRuleStatemachineTrigger368 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineTrigger375 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__0_in_ruleStatemachineTrigger401 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineAction_in_entryRuleStatemachineAction428 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineAction435 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineAction__Alternatives_in_ruleStatemachineAction461 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralBlinkRate_in_entryRuleStatemachineActionPeripheralBlinkRate488 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralBlinkRate495 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__Group__0_in_ruleStatemachineActionPeripheralBlinkRate521 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralClear_in_entryRuleStatemachineActionPeripheralClear548 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralClear555 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralClear__Group__0_in_ruleStatemachineActionPeripheralClear581 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralCreateWindow_in_entryRuleStatemachineActionPeripheralCreateWindow608 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralCreateWindow615 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__0_in_ruleStatemachineActionPeripheralCreateWindow641 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralCursorType_in_entryRuleStatemachineActionPeripheralCursorType668 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralCursorType675 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__Group__0_in_ruleStatemachineActionPeripheralCursorType701 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDestroyWindow_in_entryRuleStatemachineActionPeripheralDestroyWindow728 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDestroyWindow735 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDestroyWindow__Group__0_in_ruleStatemachineActionPeripheralDestroyWindow761 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDeviceBrightness_in_entryRuleStatemachineActionPeripheralDeviceBrightness788 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDeviceBrightness795 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__Group__0_in_ruleStatemachineActionPeripheralDeviceBrightness821 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDisplayBitmap_in_entryRuleStatemachineActionPeripheralDisplayBitmap848 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDisplayBitmap855 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__0_in_ruleStatemachineActionPeripheralDisplayBitmap881 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDisplayText_in_entryRuleStatemachineActionPeripheralDisplayText908 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDisplayText915 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__0_in_ruleStatemachineActionPeripheralDisplayText941 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDisplayTextAt_in_entryRuleStatemachineActionPeripheralDisplayTextAt968 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDisplayTextAt975 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__0_in_ruleStatemachineActionPeripheralDisplayTextAt1001 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralInterCharacterWait_in_entryRuleStatemachineActionPeripheralInterCharacterWait1028 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralInterCharacterWait1035 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__Group__0_in_ruleStatemachineActionPeripheralInterCharacterWait1061 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralMarqueeFormat_in_entryRuleStatemachineActionPeripheralMarqueeFormat1088 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralMarqueeFormat1095 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__Group__0_in_ruleStatemachineActionPeripheralMarqueeFormat1121 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralMarqueeRepeatWait_in_entryRuleStatemachineActionPeripheralMarqueeRepeatWait1148 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralMarqueeRepeatWait1155 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__0_in_ruleStatemachineActionPeripheralMarqueeRepeatWait1181 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralMarqueeType_in_entryRuleStatemachineActionPeripheralMarqueeType1208 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralMarqueeType1215 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__Group__0_in_ruleStatemachineActionPeripheralMarqueeType1241 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralMarqueeUnitWait_in_entryRuleStatemachineActionPeripheralMarqueeUnitWait1268 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralMarqueeUnitWait1275 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__0_in_ruleStatemachineActionPeripheralMarqueeUnitWait1301 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralScroll_in_entryRuleStatemachineActionPeripheralScroll1328 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralScroll1335 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__0_in_ruleStatemachineActionPeripheralScroll1361 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralOpenDrawer_in_entryRuleStatemachineActionPeripheralOpenDrawer1388 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralOpenDrawer1395 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralOpenDrawer__Group__0_in_ruleStatemachineActionPeripheralOpenDrawer1421 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintBarcode_in_entryRuleStatemachineActionPeripheralPrintBarcode1448 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintBarcode1455 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__0_in_ruleStatemachineActionPeripheralPrintBarcode1481 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintBitmap_in_entryRuleStatemachineActionPeripheralPrintBitmap1508 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintBitmap1515 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__0_in_ruleStatemachineActionPeripheralPrintBitmap1541 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintCut_in_entryRuleStatemachineActionPeripheralPrintCut1568 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintCut1575 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__0_in_ruleStatemachineActionPeripheralPrintCut1601 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintNormal_in_entryRuleStatemachineActionPeripheralPrintNormal1628 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintNormal1635 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__0_in_ruleStatemachineActionPeripheralPrintNormal1661 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintRegisterBitmap_in_entryRuleStatemachineActionPeripheralPrintRegisterBitmap1688 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintRegisterBitmap1695 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__0_in_ruleStatemachineActionPeripheralPrintRegisterBitmap1721 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTOpen_in_entryRuleStatemachineActionPeripheralPTOpen1748 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTOpen1755 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__0_in_ruleStatemachineActionPeripheralPTOpen1781 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTClose_in_entryRuleStatemachineActionPeripheralPTClose1808 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTClose1815 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTClose__Group__0_in_ruleStatemachineActionPeripheralPTClose1841 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTAcknowledge_in_entryRuleStatemachineActionPeripheralPTAcknowledge1868 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTAcknowledge1875 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAcknowledge__Group__0_in_ruleStatemachineActionPeripheralPTAcknowledge1901 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTReversal_in_entryRuleStatemachineActionPeripheralPTReversal1928 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTReversal1935 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__0_in_ruleStatemachineActionPeripheralPTReversal1961 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTRegistration_in_entryRuleStatemachineActionPeripheralPTRegistration1988 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTRegistration1995 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__0_in_ruleStatemachineActionPeripheralPTRegistration2021 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTAuthorization_in_entryRuleStatemachineActionPeripheralPTAuthorization2048 = new BitSet(new long[]{0x0000000000000000L});
+    }
+
+    protected static class FollowSets001 {
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTAuthorization2055 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__0_in_ruleStatemachineActionPeripheralPTAuthorization2081 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTResponse_in_entryRuleStatemachineActionPeripheralPTResponse2108 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTResponse2115 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTResponse__Group__0_in_ruleStatemachineActionPeripheralPTResponse2141 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintReport_in_entryRuleStatemachineActionPeripheralPrintReport2168 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintReport2175 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group__0_in_ruleStatemachineActionPeripheralPrintReport2201 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSource_in_entryRuleStatemachineActionFieldSource2228 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSource2235 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSource__Alternatives_in_ruleStatemachineActionFieldSource2261 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineOperation_in_entryRuleStatemachineOperation2288 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineOperation2295 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__0_in_ruleStatemachineOperation2321 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineGuard_in_entryRuleStatemachineGuard2348 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineGuard2355 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group__0_in_ruleStatemachineGuard2381 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineFunction_in_entryRuleStatemachineFunction2408 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineFunction2415 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__0_in_ruleStatemachineFunction2441 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineStorage_in_entryRuleStatemachineStorage2468 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineStorage2475 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__0_in_ruleStatemachineStorage2501 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineStorageRetrieve_in_entryRuleStatemachineStorageRetrieve2528 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineStorageRetrieve2535 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__0_in_ruleStatemachineStorageRetrieve2561 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionConditionalTransition_in_entryRuleStatemachineActionConditionalTransition2588 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionConditionalTransition2595 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__0_in_ruleStatemachineActionConditionalTransition2621 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceString_in_entryRuleStatemachineActionFieldSourceString2648 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceString2655 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceString__TextAssignment_in_ruleStatemachineActionFieldSourceString2681 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceNumber_in_entryRuleStatemachineActionFieldSourceNumber2708 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceNumber2715 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceNumber__ValueAssignment_in_ruleStatemachineActionFieldSourceNumber2741 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceEvaluate_in_entryRuleStatemachineActionFieldSourceEvaluate2768 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceEvaluate2775 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvaluate__EvaluationtypeAssignment_in_ruleStatemachineActionFieldSourceEvaluate2801 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceEvent_in_entryRuleStatemachineActionFieldSourceEvent2828 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceEvent2835 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvent__Group__0_in_ruleStatemachineActionFieldSourceEvent2861 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceTranslate_in_entryRuleStatemachineActionFieldSourceTranslate2888 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceTranslate2895 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslate__Group__0_in_ruleStatemachineActionFieldSourceTranslate2921 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceDtoAttribute_in_entryRuleStatemachineActionFieldSourceDtoAttribute2948 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceDtoAttribute2955 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__Group__0_in_ruleStatemachineActionFieldSourceDtoAttribute2981 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceMore_in_entryRuleStatemachineActionFieldSourceMore3008 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceMore3015 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceMore__Alternatives_in_ruleStatemachineActionFieldSourceMore3041 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceStringMore_in_entryRuleStatemachineActionFieldSourceStringMore3068 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceStringMore3075 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceStringMore__Group__0_in_ruleStatemachineActionFieldSourceStringMore3101 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceNumberMore_in_entryRuleStatemachineActionFieldSourceNumberMore3128 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceNumberMore3135 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceNumberMore__Group__0_in_ruleStatemachineActionFieldSourceNumberMore3161 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceEvaluateMore_in_entryRuleStatemachineActionFieldSourceEvaluateMore3188 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceEvaluateMore3195 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvaluateMore__Group__0_in_ruleStatemachineActionFieldSourceEvaluateMore3221 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceTranslateMore_in_entryRuleStatemachineActionFieldSourceTranslateMore3248 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceTranslateMore3255 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__Group__0_in_ruleStatemachineActionFieldSourceTranslateMore3281 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldGetMore_in_entryRuleStatemachineActionFieldGetMore3308 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldGetMore3315 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__Group__0_in_ruleStatemachineActionFieldGetMore3341 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineOperationMore_in_entryRuleStatemachineOperationMore3368 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineOperationMore3375 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__Group__0_in_ruleStatemachineOperationMore3401 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineStorageRetrieveMore_in_entryRuleStatemachineStorageRetrieveMore3428 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineStorageRetrieveMore3435 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__0_in_ruleStatemachineStorageRetrieveMore3461 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceDtoAttributeMore_in_entryRuleStatemachineActionFieldSourceDtoAttributeMore3488 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSourceDtoAttributeMore3495 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__0_in_ruleStatemachineActionFieldSourceDtoAttributeMore3521 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldConcatenation_in_entryRuleStatemachineActionFieldConcatenation3548 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldConcatenation3555 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldConcatenation__Group__0_in_ruleStatemachineActionFieldConcatenation3581 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineOperationParameter_in_entryRuleStatemachineOperationParameter3608 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineOperationParameter3615 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationParameter__SourceAssignment_in_ruleStatemachineOperationParameter3641 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineOperationParameterMore_in_entryRuleStatemachineOperationParameterMore3668 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineOperationParameterMore3675 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationParameterMore__Group__0_in_ruleStatemachineOperationParameterMore3701 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSet_in_entryRuleStatemachineActionFieldSet3728 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldSet3735 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__Group__0_in_ruleStatemachineActionFieldSet3761 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldClear_in_entryRuleStatemachineActionFieldClear3788 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldClear3795 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldClear__Group__0_in_ruleStatemachineActionFieldClear3821 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldGet_in_entryRuleStatemachineActionFieldGet3848 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldGet3855 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGet__Group__0_in_ruleStatemachineActionFieldGet3881 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldRemove_in_entryRuleStatemachineActionFieldRemove3908 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionFieldRemove3915 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldRemove__Group__0_in_ruleStatemachineActionFieldRemove3941 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionItemVisible_in_entryRuleStatemachineActionItemVisible3970 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionItemVisible3977 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionItemVisible__Group__0_in_ruleStatemachineActionItemVisible4003 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionItemInvisible_in_entryRuleStatemachineActionItemInvisible4030 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionItemInvisible4037 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets002 {
+        public static final BitSet FOLLOW_rule__StatemachineActionItemInvisible__Group__0_in_ruleStatemachineActionItemInvisible4063 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionButtonCaption_in_entryRuleStatemachineActionButtonCaption4090 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionButtonCaption4097 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__Group__0_in_ruleStatemachineActionButtonCaption4123 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionButtonImage_in_entryRuleStatemachineActionButtonImage4150 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionButtonImage4157 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__Group__0_in_ruleStatemachineActionButtonImage4183 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionDTOFind_in_entryRuleStatemachineActionDTOFind4210 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionDTOFind4217 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__0_in_ruleStatemachineActionDTOFind4243 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionScheduler_in_entryRuleStatemachineActionScheduler4270 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineActionScheduler4277 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionScheduler__Group__0_in_ruleStatemachineActionScheduler4303 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControl_in_entryRuleStatemachineControl4330 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControl4337 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControl__Alternatives_in_ruleStatemachineControl4363 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButton_in_entryRuleStatemachineControlButton4390 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlButton4397 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__0_in_ruleStatemachineControlButton4423 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlField_in_entryRuleStatemachineControlField4450 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlField4457 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__0_in_ruleStatemachineControlField4483 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlDTO_in_entryRuleStatemachineControlDTO4510 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlDTO4517 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__0_in_ruleStatemachineControlDTO4543 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlScheduler_in_entryRuleStatemachineControlScheduler4570 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlScheduler4577 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__0_in_ruleStatemachineControlScheduler4603 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachinePeripheralDeviceLineDisplay_in_entryRuleStatemachinePeripheralDeviceLineDisplay4630 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachinePeripheralDeviceLineDisplay4637 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceLineDisplay__Group__0_in_ruleStatemachinePeripheralDeviceLineDisplay4663 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachinePeripheralDevicePOSPrinter_in_entryRuleStatemachinePeripheralDevicePOSPrinter4690 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachinePeripheralDevicePOSPrinter4697 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePOSPrinter__Group__0_in_ruleStatemachinePeripheralDevicePOSPrinter4723 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachinePeripheralDeviceCashDrawer_in_entryRuleStatemachinePeripheralDeviceCashDrawer4750 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachinePeripheralDeviceCashDrawer4757 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceCashDrawer__Group__0_in_ruleStatemachinePeripheralDeviceCashDrawer4783 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachinePeripheralDevicePT_in_entryRuleStatemachinePeripheralDevicePT4810 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachinePeripheralDevicePT4817 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePT__Group__0_in_ruleStatemachinePeripheralDevicePT4843 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlPeripheral_in_entryRuleStatemachineControlPeripheral4870 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlPeripheral4877 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__0_in_ruleStatemachineControlPeripheral4903 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButtonAttribute_in_entryRuleStatemachineControlButtonAttribute4930 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlButtonAttribute4937 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group__0_in_ruleStatemachineControlButtonAttribute4963 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButtonAttributeEvent_in_entryRuleStatemachineControlButtonAttributeEvent4990 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlButtonAttributeEvent4997 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEvent__Alternatives_in_ruleStatemachineControlButtonAttributeEvent5023 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButtonAttributeEventKeyboard_in_entryRuleStatemachineControlButtonAttributeEventKeyboard5050 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlButtonAttributeEventKeyboard5057 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventKeyboard__Group__0_in_ruleStatemachineControlButtonAttributeEventKeyboard5083 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButtonAttributeEventIdentity_in_entryRuleStatemachineControlButtonAttributeEventIdentity5110 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlButtonAttributeEventIdentity5117 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventIdentity__Group__0_in_ruleStatemachineControlButtonAttributeEventIdentity5143 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButtonAttributeEventEvent_in_entryRuleStatemachineControlButtonAttributeEventEvent5170 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlButtonAttributeEventEvent5177 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventEvent__Group__0_in_ruleStatemachineControlButtonAttributeEventEvent5203 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlFieldAttribute_in_entryRuleStatemachineControlFieldAttribute5230 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlFieldAttribute5237 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__Group__0_in_ruleStatemachineControlFieldAttribute5263 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlFieldLayout_in_entryRuleStatemachineControlFieldLayout5290 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlFieldLayout5297 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldLayout__Group__0_in_ruleStatemachineControlFieldLayout5323 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlDTOAttribute_in_entryRuleStatemachineControlDTOAttribute5350 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlDTOAttribute5357 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__0_in_ruleStatemachineControlDTOAttribute5383 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlSchedulerAttribute_in_entryRuleStatemachineControlSchedulerAttribute5410 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineControlSchedulerAttribute5417 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__0_in_ruleStatemachineControlSchedulerAttribute5443 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineDTOType_in_entryRuleStatemachineDTOType5470 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineDTOType5477 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineDTOType__AttributeTypeAssignment_in_ruleStatemachineDTOType5503 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineFieldType_in_entryRuleStatemachineFieldType5530 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineFieldType5537 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFieldType__AttributeTypeAssignment_in_ruleStatemachineFieldType5563 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineImport_in_entryRuleStatemachineImport5590 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineImport5597 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineImport__Group__0_in_ruleStatemachineImport5623 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineQualifiedNameWithWildCard_in_entryRuleStatemachineQualifiedNameWithWildCard5650 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleStatemachineQualifiedNameWithWildCard5657 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineQualifiedNameWithWildCard__Group__0_in_ruleStatemachineQualifiedNameWithWildCard5683 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName5710 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleQualifiedName5717 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__QualifiedName__Group__0_in_ruleQualifiedName5743 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleValidID_in_entryRuleValidID5770 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleValidID5777 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_ID_in_ruleValidID5803 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleTRANSLATABLESTRING_in_entryRuleTRANSLATABLESTRING5829 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleTRANSLATABLESTRING5836 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_STRING_in_ruleTRANSLATABLESTRING5862 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleTRANSLATABLEID_in_entryRuleTRANSLATABLEID5888 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleTRANSLATABLEID5895 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_ID_in_ruleTRANSLATABLEID5921 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleSignedNumber_in_entryRuleSignedNumber5947 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleSignedNumber5954 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__SignedNumber__Group__0_in_ruleSignedNumber5980 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleUnsignedNumber_in_entryRuleUnsignedNumber6007 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleUnsignedNumber6014 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__UnsignedNumber__Group__0_in_ruleUnsignedNumber6040 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets003 {
+        public static final BitSet FOLLOW_ruleXAnnotation_in_entryRuleXAnnotation6067 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXAnnotation6074 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group__0_in_ruleXAnnotation6100 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAnnotationElementValuePair_in_entryRuleXAnnotationElementValuePair6127 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXAnnotationElementValuePair6134 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group__0_in_ruleXAnnotationElementValuePair6160 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAnnotationElementValueOrCommaList_in_entryRuleXAnnotationElementValueOrCommaList6187 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXAnnotationElementValueOrCommaList6194 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Alternatives_in_ruleXAnnotationElementValueOrCommaList6220 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAnnotationElementValue_in_entryRuleXAnnotationElementValue6247 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXAnnotationElementValue6254 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Alternatives_in_ruleXAnnotationElementValue6280 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAnnotationOrExpression_in_entryRuleXAnnotationOrExpression6307 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXAnnotationOrExpression6314 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationOrExpression__Alternatives_in_ruleXAnnotationOrExpression6340 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXExpression_in_entryRuleXExpression6367 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXExpression6374 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAssignment_in_ruleXExpression6400 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAssignment_in_entryRuleXAssignment6426 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXAssignment6433 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Alternatives_in_ruleXAssignment6459 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpSingleAssign_in_entryRuleOpSingleAssign6486 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpSingleAssign6493 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_13_in_ruleOpSingleAssign6520 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpMultiAssign_in_entryRuleOpMultiAssign6548 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpMultiAssign6555 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Alternatives_in_ruleOpMultiAssign6581 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXOrExpression_in_entryRuleXOrExpression6608 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXOrExpression6615 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group__0_in_ruleXOrExpression6641 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpOr_in_entryRuleOpOr6668 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpOr6675 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_14_in_ruleOpOr6702 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAndExpression_in_entryRuleXAndExpression6730 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXAndExpression6737 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group__0_in_ruleXAndExpression6763 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpAnd_in_entryRuleOpAnd6790 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpAnd6797 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_15_in_ruleOpAnd6824 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXEqualityExpression_in_entryRuleXEqualityExpression6852 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXEqualityExpression6859 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group__0_in_ruleXEqualityExpression6885 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpEquality_in_entryRuleOpEquality6912 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpEquality6919 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpEquality__Alternatives_in_ruleOpEquality6945 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXRelationalExpression_in_entryRuleXRelationalExpression6972 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXRelationalExpression6979 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group__0_in_ruleXRelationalExpression7005 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpCompare_in_entryRuleOpCompare7032 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpCompare7039 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpCompare__Alternatives_in_ruleOpCompare7065 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXOtherOperatorExpression_in_entryRuleXOtherOperatorExpression7092 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXOtherOperatorExpression7099 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group__0_in_ruleXOtherOperatorExpression7125 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpOther_in_entryRuleOpOther7152 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpOther7159 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Alternatives_in_ruleOpOther7185 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAdditiveExpression_in_entryRuleXAdditiveExpression7212 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXAdditiveExpression7219 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAdditiveExpression__Group__0_in_ruleXAdditiveExpression7245 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpAdd_in_entryRuleOpAdd7272 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpAdd7279 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpAdd__Alternatives_in_ruleOpAdd7305 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXMultiplicativeExpression_in_entryRuleXMultiplicativeExpression7332 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXMultiplicativeExpression7339 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMultiplicativeExpression__Group__0_in_ruleXMultiplicativeExpression7365 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpMulti_in_entryRuleOpMulti7392 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpMulti7399 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMulti__Alternatives_in_ruleOpMulti7425 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXUnaryOperation_in_entryRuleXUnaryOperation7452 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXUnaryOperation7459 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XUnaryOperation__Alternatives_in_ruleXUnaryOperation7485 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpUnary_in_entryRuleOpUnary7512 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpUnary7519 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpUnary__Alternatives_in_ruleOpUnary7545 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXCastedExpression_in_entryRuleXCastedExpression7572 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXCastedExpression7579 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XCastedExpression__Group__0_in_ruleXCastedExpression7605 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXPostfixOperation_in_entryRuleXPostfixOperation7632 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXPostfixOperation7639 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XPostfixOperation__Group__0_in_ruleXPostfixOperation7665 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpPostfix_in_entryRuleOpPostfix7692 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleOpPostfix7699 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpPostfix__Alternatives_in_ruleOpPostfix7725 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXMemberFeatureCall_in_entryRuleXMemberFeatureCall7752 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXMemberFeatureCall7759 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMemberFeatureCall__Group__0_in_ruleXMemberFeatureCall7785 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXPrimaryExpression_in_entryRuleXPrimaryExpression7812 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXPrimaryExpression7819 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XPrimaryExpression__Alternatives_in_ruleXPrimaryExpression7845 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXLiteral_in_entryRuleXLiteral7872 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXLiteral7879 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XLiteral__Alternatives_in_ruleXLiteral7905 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXCollectionLiteral_in_entryRuleXCollectionLiteral7932 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXCollectionLiteral7939 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XCollectionLiteral__Alternatives_in_ruleXCollectionLiteral7965 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXSetLiteral_in_entryRuleXSetLiteral7992 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXSetLiteral7999 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XSetLiteral__Group__0_in_ruleXSetLiteral8025 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXListLiteral_in_entryRuleXListLiteral8052 = new BitSet(new long[]{0x0000000000000000L});
+    }
+
+    protected static class FollowSets004 {
+        public static final BitSet FOLLOW_EOF_in_entryRuleXListLiteral8059 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XListLiteral__Group__0_in_ruleXListLiteral8085 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXClosure_in_entryRuleXClosure8112 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXClosure8119 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XClosure__Group__0_in_ruleXClosure8145 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXExpressionInClosure_in_entryRuleXExpressionInClosure8172 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXExpressionInClosure8179 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XExpressionInClosure__Group__0_in_ruleXExpressionInClosure8205 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXShortClosure_in_entryRuleXShortClosure8232 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXShortClosure8239 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XShortClosure__Group__0_in_ruleXShortClosure8265 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXParenthesizedExpression_in_entryRuleXParenthesizedExpression8292 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXParenthesizedExpression8299 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XParenthesizedExpression__Group__0_in_ruleXParenthesizedExpression8325 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXIfExpression_in_entryRuleXIfExpression8352 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXIfExpression8359 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XIfExpression__Group__0_in_ruleXIfExpression8385 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXSwitchExpression_in_entryRuleXSwitchExpression8412 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXSwitchExpression8419 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XSwitchExpression__Group__0_in_ruleXSwitchExpression8445 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXCasePart_in_entryRuleXCasePart8472 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXCasePart8479 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XCasePart__Group__0_in_ruleXCasePart8505 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXForLoopExpression_in_entryRuleXForLoopExpression8532 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXForLoopExpression8539 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XForLoopExpression__Group__0_in_ruleXForLoopExpression8565 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXBasicForLoopExpression_in_entryRuleXBasicForLoopExpression8592 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXBasicForLoopExpression8599 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XBasicForLoopExpression__Group__0_in_ruleXBasicForLoopExpression8625 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXWhileExpression_in_entryRuleXWhileExpression8652 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXWhileExpression8659 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XWhileExpression__Group__0_in_ruleXWhileExpression8685 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXDoWhileExpression_in_entryRuleXDoWhileExpression8712 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXDoWhileExpression8719 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XDoWhileExpression__Group__0_in_ruleXDoWhileExpression8745 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXBlockExpression_in_entryRuleXBlockExpression8772 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXBlockExpression8779 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XBlockExpression__Group__0_in_ruleXBlockExpression8805 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXExpressionOrVarDeclaration_in_entryRuleXExpressionOrVarDeclaration8832 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXExpressionOrVarDeclaration8839 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XExpressionOrVarDeclaration__Alternatives_in_ruleXExpressionOrVarDeclaration8865 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXVariableDeclaration_in_entryRuleXVariableDeclaration8892 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXVariableDeclaration8899 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XVariableDeclaration__Group__0_in_ruleXVariableDeclaration8925 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmFormalParameter_in_entryRuleJvmFormalParameter8952 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmFormalParameter8959 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmFormalParameter__Group__0_in_ruleJvmFormalParameter8985 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleFullJvmFormalParameter_in_entryRuleFullJvmFormalParameter9012 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleFullJvmFormalParameter9019 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__FullJvmFormalParameter__Group__0_in_ruleFullJvmFormalParameter9045 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXFeatureCall_in_entryRuleXFeatureCall9072 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXFeatureCall9079 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XFeatureCall__Group__0_in_ruleXFeatureCall9105 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleFeatureCallID_in_entryRuleFeatureCallID9132 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleFeatureCallID9139 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__FeatureCallID__Alternatives_in_ruleFeatureCallID9165 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleIdOrSuper_in_entryRuleIdOrSuper9192 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleIdOrSuper9199 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__IdOrSuper__Alternatives_in_ruleIdOrSuper9225 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXConstructorCall_in_entryRuleXConstructorCall9252 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXConstructorCall9259 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XConstructorCall__Group__0_in_ruleXConstructorCall9285 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXBooleanLiteral_in_entryRuleXBooleanLiteral9312 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXBooleanLiteral9319 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XBooleanLiteral__Group__0_in_ruleXBooleanLiteral9345 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXNullLiteral_in_entryRuleXNullLiteral9372 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXNullLiteral9379 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XNullLiteral__Group__0_in_ruleXNullLiteral9405 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXNumberLiteral_in_entryRuleXNumberLiteral9432 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXNumberLiteral9439 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XNumberLiteral__Group__0_in_ruleXNumberLiteral9465 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXStringLiteral_in_entryRuleXStringLiteral9492 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXStringLiteral9499 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XStringLiteral__Group__0_in_ruleXStringLiteral9525 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXTypeLiteral_in_entryRuleXTypeLiteral9552 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXTypeLiteral9559 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XTypeLiteral__Group__0_in_ruleXTypeLiteral9585 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXThrowExpression_in_entryRuleXThrowExpression9612 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXThrowExpression9619 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XThrowExpression__Group__0_in_ruleXThrowExpression9645 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXReturnExpression_in_entryRuleXReturnExpression9672 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXReturnExpression9679 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XReturnExpression__Group__0_in_ruleXReturnExpression9705 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXTryCatchFinallyExpression_in_entryRuleXTryCatchFinallyExpression9732 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXTryCatchFinallyExpression9739 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XTryCatchFinallyExpression__Group__0_in_ruleXTryCatchFinallyExpression9765 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXSynchronizedExpression_in_entryRuleXSynchronizedExpression9792 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXSynchronizedExpression9799 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XSynchronizedExpression__Group__0_in_ruleXSynchronizedExpression9825 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXCatchClause_in_entryRuleXCatchClause9852 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXCatchClause9859 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XCatchClause__Group__0_in_ruleXCatchClause9885 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleNumber_in_entryRuleNumber9917 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleNumber9924 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Number__Alternatives_in_ruleNumber9954 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference9983 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmTypeReference9990 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmTypeReference__Alternatives_in_ruleJvmTypeReference10016 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets10043 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleArrayBrackets10050 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets005 {
+        public static final BitSet FOLLOW_rule__ArrayBrackets__Group__0_in_ruleArrayBrackets10076 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef10103 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXFunctionTypeRef10110 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XFunctionTypeRef__Group__0_in_ruleXFunctionTypeRef10136 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference10163 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference10170 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmParameterizedTypeReference__Group__0_in_ruleJvmParameterizedTypeReference10196 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference10223 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference10230 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmArgumentTypeReference__Alternatives_in_ruleJvmArgumentTypeReference10256 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference10283 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference10290 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmWildcardTypeReference__Group__0_in_ruleJvmWildcardTypeReference10316 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound10343 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmUpperBound10350 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmUpperBound__Group__0_in_ruleJvmUpperBound10376 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded10403 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded10410 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmUpperBoundAnded__Group__0_in_ruleJvmUpperBoundAnded10436 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound10463 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmLowerBound10470 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmLowerBound__Group__0_in_ruleJvmLowerBound10496 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded10523 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded10530 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmLowerBoundAnded__Group__0_in_ruleJvmLowerBoundAnded10556 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard10585 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard10592 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__QualifiedNameWithWildcard__Group__0_in_ruleQualifiedNameWithWildcard10618 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration10647 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleXImportDeclaration10654 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XImportDeclaration__Group__0_in_ruleXImportDeclaration10680 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport10707 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport10714 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport10742 = new BitSet(new long[]{0x0000000000000012L});
+        public static final BitSet FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport10754 = new BitSet(new long[]{0x0000000000000012L});
+        public static final BitSet FOLLOW_rule__StatemachineInternalType__Alternatives_in_ruleStatemachineInternalType10794 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonEventType__Alternatives_in_ruleStatemachineControlButtonEventType10830 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineEvaluationType__Alternatives_in_ruleStatemachineEvaluationType10866 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineUserMessageType__Alternatives_in_ruleStatemachineUserMessageType10902 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineLineDisplayCursorType__Alternatives_in_ruleStatemachineLineDisplayCursorType10938 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineLineDisplayMarqueeType__Alternatives_in_ruleStatemachineLineDisplayMarqueeType10974 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineLineDisplayMarqueeFormat__Alternatives_in_ruleStatemachineLineDisplayMarqueeFormat11010 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineLineDisplayTextType__Alternatives_in_ruleStatemachineLineDisplayTextType11046 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineLineDisplayScrollTextType__Alternatives_in_ruleStatemachineLineDisplayScrollTextType11082 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePOSPrinterBarcodeType__Alternatives_in_ruleStatemachinePOSPrinterBarcodeType11118 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralBlinkRate_in_rule__StatemachineAction__Alternatives11153 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralClear_in_rule__StatemachineAction__Alternatives11170 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralCreateWindow_in_rule__StatemachineAction__Alternatives11187 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralCursorType_in_rule__StatemachineAction__Alternatives11204 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDestroyWindow_in_rule__StatemachineAction__Alternatives11221 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDeviceBrightness_in_rule__StatemachineAction__Alternatives11238 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDisplayBitmap_in_rule__StatemachineAction__Alternatives11255 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDisplayText_in_rule__StatemachineAction__Alternatives11272 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralDisplayTextAt_in_rule__StatemachineAction__Alternatives11289 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralInterCharacterWait_in_rule__StatemachineAction__Alternatives11306 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralMarqueeFormat_in_rule__StatemachineAction__Alternatives11323 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralMarqueeRepeatWait_in_rule__StatemachineAction__Alternatives11340 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralMarqueeType_in_rule__StatemachineAction__Alternatives11357 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralMarqueeUnitWait_in_rule__StatemachineAction__Alternatives11374 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralScroll_in_rule__StatemachineAction__Alternatives11391 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralOpenDrawer_in_rule__StatemachineAction__Alternatives11408 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintBarcode_in_rule__StatemachineAction__Alternatives11425 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintBitmap_in_rule__StatemachineAction__Alternatives11442 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintCut_in_rule__StatemachineAction__Alternatives11459 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintNormal_in_rule__StatemachineAction__Alternatives11476 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintRegisterBitmap_in_rule__StatemachineAction__Alternatives11493 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTOpen_in_rule__StatemachineAction__Alternatives11510 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTClose_in_rule__StatemachineAction__Alternatives11527 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTAcknowledge_in_rule__StatemachineAction__Alternatives11544 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTReversal_in_rule__StatemachineAction__Alternatives11561 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTRegistration_in_rule__StatemachineAction__Alternatives11578 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTAuthorization_in_rule__StatemachineAction__Alternatives11595 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPrintReport_in_rule__StatemachineAction__Alternatives11612 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSet_in_rule__StatemachineAction__Alternatives11629 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldRemove_in_rule__StatemachineAction__Alternatives11646 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionItemVisible_in_rule__StatemachineAction__Alternatives11663 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionItemInvisible_in_rule__StatemachineAction__Alternatives11680 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldClear_in_rule__StatemachineAction__Alternatives11697 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionButtonCaption_in_rule__StatemachineAction__Alternatives11714 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionButtonImage_in_rule__StatemachineAction__Alternatives11731 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionDTOFind_in_rule__StatemachineAction__Alternatives11748 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineStorage_in_rule__StatemachineAction__Alternatives11765 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionScheduler_in_rule__StatemachineAction__Alternatives11782 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineOperation_in_rule__StatemachineAction__Alternatives11799 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionConditionalTransition_in_rule__StatemachineAction__Alternatives11816 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceString_in_rule__StatemachineActionFieldSource__Alternatives11848 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceNumber_in_rule__StatemachineActionFieldSource__Alternatives11865 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceEvaluate_in_rule__StatemachineActionFieldSource__Alternatives11882 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceTranslate_in_rule__StatemachineActionFieldSource__Alternatives11899 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldGet_in_rule__StatemachineActionFieldSource__Alternatives11916 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineFunction_in_rule__StatemachineActionFieldSource__Alternatives11933 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineStorageRetrieve_in_rule__StatemachineActionFieldSource__Alternatives11950 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceDtoAttribute_in_rule__StatemachineActionFieldSource__Alternatives11967 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceEvent_in_rule__StatemachineActionFieldSource__Alternatives11984 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionPeripheralPTResponse_in_rule__StatemachineActionFieldSource__Alternatives12001 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceStringMore_in_rule__StatemachineActionFieldSourceMore__Alternatives12033 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceNumberMore_in_rule__StatemachineActionFieldSourceMore__Alternatives12050 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceEvaluateMore_in_rule__StatemachineActionFieldSourceMore__Alternatives12067 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceTranslateMore_in_rule__StatemachineActionFieldSourceMore__Alternatives12084 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldGetMore_in_rule__StatemachineActionFieldSourceMore__Alternatives12101 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets006 {
+        public static final BitSet FOLLOW_ruleStatemachineOperationMore_in_rule__StatemachineActionFieldSourceMore__Alternatives12118 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineStorageRetrieveMore_in_rule__StatemachineActionFieldSourceMore__Alternatives12135 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineActionFieldSourceDtoAttributeMore_in_rule__StatemachineActionFieldSourceMore__Alternatives12152 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButton_in_rule__StatemachineControl__Alternatives12185 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlField_in_rule__StatemachineControl__Alternatives12202 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlDTO_in_rule__StatemachineControl__Alternatives12219 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlScheduler_in_rule__StatemachineControl__Alternatives12236 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlPeripheral_in_rule__StatemachineControl__Alternatives12253 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButtonAttributeEventKeyboard_in_rule__StatemachineControlButtonAttributeEvent__Alternatives12285 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButtonAttributeEventIdentity_in_rule__StatemachineControlButtonAttributeEvent__Alternatives12302 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleStatemachineControlButtonAttributeEventEvent_in_rule__StatemachineControlButtonAttributeEvent__Alternatives12319 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3_1_0__0_in_rule__XAnnotation__Alternatives_3_112351 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__ValueAssignment_3_1_1_in_rule__XAnnotation__Alternatives_3_112369 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives12402 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives12420 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0__0_in_rule__XAnnotationElementValue__Alternatives12453 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAnnotationOrExpression_in_rule__XAnnotationElementValue__Alternatives12471 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAnnotation_in_rule__XAnnotationOrExpression__Alternatives12503 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXExpression_in_rule__XAnnotationOrExpression__Alternatives12520 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_0__0_in_rule__XAssignment__Alternatives12552 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1__0_in_rule__XAssignment__Alternatives12570 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_16_in_rule__OpMultiAssign__Alternatives12604 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_17_in_rule__OpMultiAssign__Alternatives12624 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_18_in_rule__OpMultiAssign__Alternatives12644 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_19_in_rule__OpMultiAssign__Alternatives12664 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_20_in_rule__OpMultiAssign__Alternatives12684 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_5__0_in_rule__OpMultiAssign__Alternatives12703 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_6__0_in_rule__OpMultiAssign__Alternatives12721 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_21_in_rule__OpEquality__Alternatives12755 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_22_in_rule__OpEquality__Alternatives12775 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_23_in_rule__OpEquality__Alternatives12795 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_24_in_rule__OpEquality__Alternatives12815 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0__0_in_rule__XRelationalExpression__Alternatives_112849 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1__0_in_rule__XRelationalExpression__Alternatives_112867 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_25_in_rule__OpCompare__Alternatives12901 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpCompare__Group_1__0_in_rule__OpCompare__Alternatives12920 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_26_in_rule__OpCompare__Alternatives12939 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_27_in_rule__OpCompare__Alternatives12959 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_28_in_rule__OpOther__Alternatives12994 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_29_in_rule__OpOther__Alternatives13014 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_2__0_in_rule__OpOther__Alternatives13033 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_30_in_rule__OpOther__Alternatives13052 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_31_in_rule__OpOther__Alternatives13072 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5__0_in_rule__OpOther__Alternatives13091 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6__0_in_rule__OpOther__Alternatives13109 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_32_in_rule__OpOther__Alternatives13128 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_33_in_rule__OpOther__Alternatives13148 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5_1_0__0_in_rule__OpOther__Alternatives_5_113182 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_26_in_rule__OpOther__Alternatives_5_113201 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6_1_0__0_in_rule__OpOther__Alternatives_6_113235 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_27_in_rule__OpOther__Alternatives_6_113254 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_31_in_rule__OpOther__Alternatives_6_113274 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__OpAdd__Alternatives13309 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_35_in_rule__OpAdd__Alternatives13329 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_36_in_rule__OpMulti__Alternatives13364 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_37_in_rule__OpMulti__Alternatives13384 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_38_in_rule__OpMulti__Alternatives13404 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_39_in_rule__OpMulti__Alternatives13424 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XUnaryOperation__Group_0__0_in_rule__XUnaryOperation__Alternatives13458 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXCastedExpression_in_rule__XUnaryOperation__Alternatives13476 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_40_in_rule__OpUnary__Alternatives13509 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_35_in_rule__OpUnary__Alternatives13529 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__OpUnary__Alternatives13549 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_41_in_rule__OpPostfix__Alternatives13584 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_42_in_rule__OpPostfix__Alternatives13604 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMemberFeatureCall__Group_1_0__0_in_rule__XMemberFeatureCall__Alternatives_113638 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMemberFeatureCall__Group_1_1__0_in_rule__XMemberFeatureCall__Alternatives_113656 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__XMemberFeatureCall__Alternatives_1_0_0_0_113690 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1_in_rule__XMemberFeatureCall__Alternatives_1_0_0_0_113709 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__XMemberFeatureCall__Alternatives_1_1_0_0_113743 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1_in_rule__XMemberFeatureCall__Alternatives_1_1_0_0_113762 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2_in_rule__XMemberFeatureCall__Alternatives_1_1_0_0_113780 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0_in_rule__XMemberFeatureCall__Alternatives_1_1_3_113813 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XMemberFeatureCall__Group_1_1_3_1_1__0_in_rule__XMemberFeatureCall__Alternatives_1_1_3_113831 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXConstructorCall_in_rule__XPrimaryExpression__Alternatives13864 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXBlockExpression_in_rule__XPrimaryExpression__Alternatives13881 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXSwitchExpression_in_rule__XPrimaryExpression__Alternatives13898 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXSynchronizedExpression_in_rule__XPrimaryExpression__Alternatives13916 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXFeatureCall_in_rule__XPrimaryExpression__Alternatives13934 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXLiteral_in_rule__XPrimaryExpression__Alternatives13951 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXIfExpression_in_rule__XPrimaryExpression__Alternatives13968 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXForLoopExpression_in_rule__XPrimaryExpression__Alternatives13986 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXBasicForLoopExpression_in_rule__XPrimaryExpression__Alternatives14004 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXWhileExpression_in_rule__XPrimaryExpression__Alternatives14021 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXDoWhileExpression_in_rule__XPrimaryExpression__Alternatives14038 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXThrowExpression_in_rule__XPrimaryExpression__Alternatives14055 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXReturnExpression_in_rule__XPrimaryExpression__Alternatives14072 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXTryCatchFinallyExpression_in_rule__XPrimaryExpression__Alternatives14089 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXParenthesizedExpression_in_rule__XPrimaryExpression__Alternatives14106 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXCollectionLiteral_in_rule__XLiteral__Alternatives14138 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXClosure_in_rule__XLiteral__Alternatives14156 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXBooleanLiteral_in_rule__XLiteral__Alternatives14174 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXNumberLiteral_in_rule__XLiteral__Alternatives14191 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXNullLiteral_in_rule__XLiteral__Alternatives14208 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXStringLiteral_in_rule__XLiteral__Alternatives14225 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXTypeLiteral_in_rule__XLiteral__Alternatives14242 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXSetLiteral_in_rule__XCollectionLiteral__Alternatives14274 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXListLiteral_in_rule__XCollectionLiteral__Alternatives14291 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XSwitchExpression__Group_2_0__0_in_rule__XSwitchExpression__Alternatives_214323 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XSwitchExpression__Group_2_1__0_in_rule__XSwitchExpression__Alternatives_214341 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets007 {
+        public static final BitSet FOLLOW_rule__XCasePart__Group_3_0__0_in_rule__XCasePart__Alternatives_314374 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XCasePart__FallThroughAssignment_3_1_in_rule__XCasePart__Alternatives_314392 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXVariableDeclaration_in_rule__XExpressionOrVarDeclaration__Alternatives14425 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXExpression_in_rule__XExpressionOrVarDeclaration__Alternatives14442 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XVariableDeclaration__WriteableAssignment_1_0_in_rule__XVariableDeclaration__Alternatives_114474 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_44_in_rule__XVariableDeclaration__Alternatives_114493 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XVariableDeclaration__Group_2_0__0_in_rule__XVariableDeclaration__Alternatives_214527 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XVariableDeclaration__NameAssignment_2_1_in_rule__XVariableDeclaration__Alternatives_214545 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0_in_rule__XFeatureCall__Alternatives_3_114578 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XFeatureCall__Group_3_1_1__0_in_rule__XFeatureCall__Alternatives_3_114596 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleValidID_in_rule__FeatureCallID__Alternatives14629 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_45_in_rule__FeatureCallID__Alternatives14647 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_46_in_rule__FeatureCallID__Alternatives14667 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_47_in_rule__FeatureCallID__Alternatives14687 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_48_in_rule__FeatureCallID__Alternatives14707 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleFeatureCallID_in_rule__IdOrSuper__Alternatives14741 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_49_in_rule__IdOrSuper__Alternatives14759 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XConstructorCall__ArgumentsAssignment_4_1_0_in_rule__XConstructorCall__Alternatives_4_114793 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XConstructorCall__Group_4_1_1__0_in_rule__XConstructorCall__Alternatives_4_114811 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_50_in_rule__XBooleanLiteral__Alternatives_114845 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XBooleanLiteral__IsTrueAssignment_1_1_in_rule__XBooleanLiteral__Alternatives_114864 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XTryCatchFinallyExpression__Group_3_0__0_in_rule__XTryCatchFinallyExpression__Alternatives_314897 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XTryCatchFinallyExpression__Group_3_1__0_in_rule__XTryCatchFinallyExpression__Alternatives_314915 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_HEX_in_rule__Number__Alternatives14948 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Number__Group_1__0_in_rule__Number__Alternatives14965 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_INT_in_rule__Number__Alternatives_1_014998 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_DECIMAL_in_rule__Number__Alternatives_1_015015 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_INT_in_rule__Number__Alternatives_1_1_115047 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_DECIMAL_in_rule__Number__Alternatives_1_1_115064 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmTypeReference__Group_0__0_in_rule__JvmTypeReference__Alternatives15096 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXFunctionTypeRef_in_rule__JvmTypeReference__Alternatives15114 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmTypeReference_in_rule__JvmArgumentTypeReference__Alternatives15146 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleJvmWildcardTypeReference_in_rule__JvmArgumentTypeReference__Alternatives15163 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmWildcardTypeReference__Group_2_0__0_in_rule__JvmWildcardTypeReference__Alternatives_215195 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__JvmWildcardTypeReference__Group_2_1__0_in_rule__JvmWildcardTypeReference__Alternatives_215213 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XImportDeclaration__Group_1_0__0_in_rule__XImportDeclaration__Alternatives_115246 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XImportDeclaration__ImportedTypeAssignment_1_1_in_rule__XImportDeclaration__Alternatives_115264 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XImportDeclaration__ImportedNamespaceAssignment_1_2_in_rule__XImportDeclaration__Alternatives_115282 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XImportDeclaration__WildcardAssignment_1_0_3_0_in_rule__XImportDeclaration__Alternatives_1_0_315315 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XImportDeclaration__MemberNameAssignment_1_0_3_1_in_rule__XImportDeclaration__Alternatives_1_0_315333 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_51_in_rule__StatemachineInternalType__Alternatives15367 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_52_in_rule__StatemachineInternalType__Alternatives15388 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_53_in_rule__StatemachineInternalType__Alternatives15409 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_54_in_rule__StatemachineInternalType__Alternatives15430 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_55_in_rule__StatemachineInternalType__Alternatives15451 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_56_in_rule__StatemachineInternalType__Alternatives15472 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_57_in_rule__StatemachineInternalType__Alternatives15493 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_58_in_rule__StatemachineControlButtonEventType__Alternatives15529 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_59_in_rule__StatemachineControlButtonEventType__Alternatives15550 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_60_in_rule__StatemachineControlButtonEventType__Alternatives15571 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_61_in_rule__StatemachineEvaluationType__Alternatives15607 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_62_in_rule__StatemachineEvaluationType__Alternatives15628 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_63_in_rule__StatemachineEvaluationType__Alternatives15649 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_64_in_rule__StatemachineEvaluationType__Alternatives15670 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_65_in_rule__StatemachineEvaluationType__Alternatives15691 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_66_in_rule__StatemachineEvaluationType__Alternatives15712 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_67_in_rule__StatemachineEvaluationType__Alternatives15733 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_68_in_rule__StatemachineEvaluationType__Alternatives15754 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_69_in_rule__StatemachineEvaluationType__Alternatives15775 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_70_in_rule__StatemachineEvaluationType__Alternatives15796 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_71_in_rule__StatemachineEvaluationType__Alternatives15817 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_72_in_rule__StatemachineEvaluationType__Alternatives15838 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_73_in_rule__StatemachineEvaluationType__Alternatives15859 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_74_in_rule__StatemachineEvaluationType__Alternatives15880 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_75_in_rule__StatemachineUserMessageType__Alternatives15916 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_76_in_rule__StatemachineUserMessageType__Alternatives15937 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_77_in_rule__StatemachineUserMessageType__Alternatives15958 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_78_in_rule__StatemachineUserMessageType__Alternatives15979 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_79_in_rule__StatemachineUserMessageType__Alternatives16000 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_80_in_rule__StatemachineLineDisplayCursorType__Alternatives16036 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_81_in_rule__StatemachineLineDisplayCursorType__Alternatives16057 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_82_in_rule__StatemachineLineDisplayCursorType__Alternatives16078 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_83_in_rule__StatemachineLineDisplayCursorType__Alternatives16099 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_84_in_rule__StatemachineLineDisplayCursorType__Alternatives16120 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_85_in_rule__StatemachineLineDisplayCursorType__Alternatives16141 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_86_in_rule__StatemachineLineDisplayCursorType__Alternatives16162 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_87_in_rule__StatemachineLineDisplayCursorType__Alternatives16183 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_80_in_rule__StatemachineLineDisplayMarqueeType__Alternatives16219 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_88_in_rule__StatemachineLineDisplayMarqueeType__Alternatives16240 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_89_in_rule__StatemachineLineDisplayMarqueeType__Alternatives16261 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_90_in_rule__StatemachineLineDisplayMarqueeType__Alternatives16282 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_91_in_rule__StatemachineLineDisplayMarqueeType__Alternatives16303 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_92_in_rule__StatemachineLineDisplayMarqueeType__Alternatives16324 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_93_in_rule__StatemachineLineDisplayMarqueeFormat__Alternatives16360 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_94_in_rule__StatemachineLineDisplayMarqueeFormat__Alternatives16381 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_95_in_rule__StatemachineLineDisplayTextType__Alternatives16417 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_87_in_rule__StatemachineLineDisplayTextType__Alternatives16438 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_85_in_rule__StatemachineLineDisplayTextType__Alternatives16459 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_96_in_rule__StatemachineLineDisplayTextType__Alternatives16480 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_88_in_rule__StatemachineLineDisplayScrollTextType__Alternatives16516 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_89_in_rule__StatemachineLineDisplayScrollTextType__Alternatives16537 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_90_in_rule__StatemachineLineDisplayScrollTextType__Alternatives16558 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_91_in_rule__StatemachineLineDisplayScrollTextType__Alternatives16579 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_97_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16615 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_98_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16636 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_99_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16657 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_100_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16678 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_101_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16699 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_102_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16720 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_103_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16741 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets008 {
+        public static final BitSet FOLLOW_104_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16762 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_105_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16783 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_106_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16804 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_107_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16825 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_108_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16846 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_109_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16867 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_110_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16888 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_111_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16909 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_112_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16930 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_113_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16951 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_114_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16972 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_115_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives16993 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_116_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17014 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_117_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17035 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_118_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17056 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_119_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17077 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_120_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17098 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_121_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17119 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_122_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17140 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_123_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17161 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_124_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17182 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_125_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17203 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_126_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17224 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_127_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17245 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_128_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17266 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_129_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17287 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_130_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17308 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_131_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17329 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_132_in_rule__StatemachinePOSPrinterBarcodeType__Alternatives17350 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group__0__Impl_in_rule__StatemachinePackage__Group__017383 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group__1_in_rule__StatemachinePackage__Group__017386 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group__1__Impl_in_rule__StatemachinePackage__Group__117444 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group__2_in_rule__StatemachinePackage__Group__117447 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_133_in_rule__StatemachinePackage__Group__1__Impl17475 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group__2__Impl_in_rule__StatemachinePackage__Group__217506 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group__3_in_rule__StatemachinePackage__Group__217509 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__NameAssignment_2_in_rule__StatemachinePackage__Group__2__Impl17536 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group__3__Impl_in_rule__StatemachinePackage__Group__317566 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group_3__0_in_rule__StatemachinePackage__Group__3__Impl17593 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group_3__0__Impl_in_rule__StatemachinePackage__Group_3__017632 = new BitSet(new long[]{0x0000800000000000L,0x0000000000000000L,0x0000000000000180L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group_3__1_in_rule__StatemachinePackage__Group_3__017635 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachinePackage__Group_3__0__Impl17663 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group_3__1__Impl_in_rule__StatemachinePackage__Group_3__117694 = new BitSet(new long[]{0x0000800000000000L,0x0000000000000000L,0x0000000000000180L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group_3__2_in_rule__StatemachinePackage__Group_3__117697 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__ImportsAssignment_3_1_in_rule__StatemachinePackage__Group_3__1__Impl17724 = new BitSet(new long[]{0x0000800000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group_3__2__Impl_in_rule__StatemachinePackage__Group_3__217755 = new BitSet(new long[]{0x0000800000000000L,0x0000000000000000L,0x0000000000000180L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group_3__3_in_rule__StatemachinePackage__Group_3__217758 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__StatemachinesAssignment_3_2_in_rule__StatemachinePackage__Group_3__2__Impl17785 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_rule__StatemachinePackage__Group_3__3__Impl_in_rule__StatemachinePackage__Group_3__317816 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachinePackage__Group_3__3__Impl17844 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__0__Impl_in_rule__Statemachine__Group__017883 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__1_in_rule__Statemachine__Group__017886 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_136_in_rule__Statemachine__Group__0__Impl17914 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__1__Impl_in_rule__Statemachine__Group__117945 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000A00L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__2_in_rule__Statemachine__Group__117948 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__NameAssignment_1_in_rule__Statemachine__Group__1__Impl17975 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__2__Impl_in_rule__Statemachine__Group__218005 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000A00L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__3_in_rule__Statemachine__Group__218008 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_2__0_in_rule__Statemachine__Group__2__Impl18035 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__3__Impl_in_rule__Statemachine__Group__318066 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000A00L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__4_in_rule__Statemachine__Group__318069 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_3__0_in_rule__Statemachine__Group__3__Impl18096 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__4__Impl_in_rule__Statemachine__Group__418127 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__5_in_rule__Statemachine__Group__418130 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_137_in_rule__Statemachine__Group__4__Impl18158 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__5__Impl_in_rule__Statemachine__Group__518189 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000400L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__6_in_rule__Statemachine__Group__518192 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__InitialStateAssignment_5_in_rule__Statemachine__Group__5__Impl18219 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__6__Impl_in_rule__Statemachine__Group__618249 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__7_in_rule__Statemachine__Group__618252 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_138_in_rule__Statemachine__Group__6__Impl18280 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__7__Impl_in_rule__Statemachine__Group__718311 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000001000L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__8_in_rule__Statemachine__Group__718314 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__InitialEventAssignment_7_in_rule__Statemachine__Group__7__Impl18341 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__8__Impl_in_rule__Statemachine__Group__818371 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000002000L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__9_in_rule__Statemachine__Group__818374 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8__0_in_rule__Statemachine__Group__8__Impl18401 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__9__Impl_in_rule__Statemachine__Group__918431 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000004000L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__10_in_rule__Statemachine__Group__918434 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_9__0_in_rule__Statemachine__Group__9__Impl18461 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group__10__Impl_in_rule__Statemachine__Group__1018491 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_10__0_in_rule__Statemachine__Group__10__Impl18518 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_2__0__Impl_in_rule__Statemachine__Group_2__018570 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_2__1_in_rule__Statemachine__Group_2__018573 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__DescriptionAssignment_2_0_in_rule__Statemachine__Group_2__0__Impl18600 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_2__1__Impl_in_rule__Statemachine__Group_2__118630 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__DescriptionValueAssignment_2_1_in_rule__Statemachine__Group_2__1__Impl18657 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_3__0__Impl_in_rule__Statemachine__Group_3__018691 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_3__1_in_rule__Statemachine__Group_3__018694 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_139_in_rule__Statemachine__Group_3__0__Impl18722 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_3__1__Impl_in_rule__Statemachine__Group_3__118753 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__FunctionGroupAssignment_3_1_in_rule__Statemachine__Group_3__1__Impl18780 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8__0__Impl_in_rule__Statemachine__Group_8__018814 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8__1_in_rule__Statemachine__Group_8__018817 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_140_in_rule__Statemachine__Group_8__0__Impl18845 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8__1__Impl_in_rule__Statemachine__Group_8__118876 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8_1__0_in_rule__Statemachine__Group_8__1__Impl18903 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8_1__0__Impl_in_rule__Statemachine__Group_8_1__018937 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008080L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8_1__1_in_rule__Statemachine__Group_8_1__018940 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__Statemachine__Group_8_1__0__Impl18968 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets009 {
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8_1__1__Impl_in_rule__Statemachine__Group_8_1__118999 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008080L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8_1__2_in_rule__Statemachine__Group_8_1__119002 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__EventsAssignment_8_1_1_in_rule__Statemachine__Group_8_1__1__Impl19029 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_8_1__2__Impl_in_rule__Statemachine__Group_8_1__219060 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__Statemachine__Group_8_1__2__Impl19088 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_9__0__Impl_in_rule__Statemachine__Group_9__019125 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_9__1_in_rule__Statemachine__Group_9__019128 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_141_in_rule__Statemachine__Group_9__0__Impl19156 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_9__1__Impl_in_rule__Statemachine__Group_9__119187 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x00000043C0000000L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_9__2_in_rule__Statemachine__Group_9__119190 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__Statemachine__Group_9__1__Impl19218 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_9__2__Impl_in_rule__Statemachine__Group_9__219249 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x00000043C0000000L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_9__3_in_rule__Statemachine__Group_9__219252 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__ControlsAssignment_9_2_in_rule__Statemachine__Group_9__2__Impl19279 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x00000043C0000000L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_9__3__Impl_in_rule__Statemachine__Group_9__319310 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__Statemachine__Group_9__3__Impl19338 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_10__0__Impl_in_rule__Statemachine__Group_10__019377 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_10__1_in_rule__Statemachine__Group_10__019380 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_142_in_rule__Statemachine__Group_10__0__Impl19408 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_10__1__Impl_in_rule__Statemachine__Group_10__119439 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000010080L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_10__2_in_rule__Statemachine__Group_10__119442 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__Statemachine__Group_10__1__Impl19470 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_10__2__Impl_in_rule__Statemachine__Group_10__219501 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000010080L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_10__3_in_rule__Statemachine__Group_10__219504 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__Statemachine__StatesAssignment_10_2_in_rule__Statemachine__Group_10__2__Impl19531 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000010000L});
+        public static final BitSet FOLLOW_rule__Statemachine__Group_10__3__Impl_in_rule__Statemachine__Group_10__319562 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__Statemachine__Group_10__3__Impl19590 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineEvent__Group__0__Impl_in_rule__StatemachineEvent__Group__019629 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineEvent__Group__1_in_rule__StatemachineEvent__Group__019632 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_143_in_rule__StatemachineEvent__Group__0__Impl19660 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineEvent__Group__1__Impl_in_rule__StatemachineEvent__Group__119691 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineEvent__NameAssignment_1_in_rule__StatemachineEvent__Group__1__Impl19718 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__0__Impl_in_rule__StatemachineState__Group__019752 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__1_in_rule__StatemachineState__Group__019755 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_144_in_rule__StatemachineState__Group__0__Impl19783 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__1__Impl_in_rule__StatemachineState__Group__119814 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__2_in_rule__StatemachineState__Group__119817 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__NameAssignment_1_in_rule__StatemachineState__Group__1__Impl19844 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__2__Impl_in_rule__StatemachineState__Group__219874 = new BitSet(new long[]{0x1000000000000000L,0x0000000000000000L,0x0000000000060000L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__3_in_rule__StatemachineState__Group__219877 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineState__Group__2__Impl19905 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__3__Impl_in_rule__StatemachineState__Group__319936 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__4_in_rule__StatemachineState__Group__319939 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__UnorderedGroup_3_in_rule__StatemachineState__Group__3__Impl19966 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group__4__Impl_in_rule__StatemachineState__Group__419996 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineState__Group__4__Impl20024 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_0__0__Impl_in_rule__StatemachineState__Group_3_0__020065 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_0__1_in_rule__StatemachineState__Group_3_0__020068 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_145_in_rule__StatemachineState__Group_3_0__0__Impl20096 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_0__1__Impl_in_rule__StatemachineState__Group_3_0__120127 = new BitSet(new long[]{0x0800000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_0__2_in_rule__StatemachineState__Group_3_0__120130 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineState__Group_3_0__1__Impl20158 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_0__2__Impl_in_rule__StatemachineState__Group_3_0__220189 = new BitSet(new long[]{0x0800000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_0__3_in_rule__StatemachineState__Group_3_0__220192 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__TriggersAssignment_3_0_2_in_rule__StatemachineState__Group_3_0__2__Impl20219 = new BitSet(new long[]{0x0800000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_0__3__Impl_in_rule__StatemachineState__Group_3_0__320250 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineState__Group_3_0__3__Impl20278 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_1__0__Impl_in_rule__StatemachineState__Group_3_1__020317 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_1__1_in_rule__StatemachineState__Group_3_1__020320 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_60_in_rule__StatemachineState__Group_3_1__0__Impl20348 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_1__1__Impl_in_rule__StatemachineState__Group_3_1__120379 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__IdentityAssignment_3_1_1_in_rule__StatemachineState__Group_3_1__1__Impl20406 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2__0__Impl_in_rule__StatemachineState__Group_3_2__020440 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2__1_in_rule__StatemachineState__Group_3_2__020443 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_146_in_rule__StatemachineState__Group_3_2__0__Impl20471 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2__1__Impl_in_rule__StatemachineState__Group_3_2__120502 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2__2_in_rule__StatemachineState__Group_3_2__120505 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineState__Group_3_2__1__Impl20533 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2__2__Impl_in_rule__StatemachineState__Group_3_2__220564 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2__3_in_rule__StatemachineState__Group_3_2__220567 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__KeystrokeAssignment_3_2_2_in_rule__StatemachineState__Group_3_2__2__Impl20594 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2__3__Impl_in_rule__StatemachineState__Group_3_2__320624 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2_3__0_in_rule__StatemachineState__Group_3_2__3__Impl20651 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2_3__0__Impl_in_rule__StatemachineState__Group_3_2_3__020690 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2_3__1_in_rule__StatemachineState__Group_3_2_3__020693 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__HasKeyOperationAssignment_3_2_3_0_in_rule__StatemachineState__Group_3_2_3__0__Impl20720 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__Group_3_2_3__1__Impl_in_rule__StatemachineState__Group_3_2_3__120750 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineState__KeyOperationAssignment_3_2_3_1_in_rule__StatemachineState__Group_3_2_3__1__Impl20777 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__0__Impl_in_rule__StatemachineTrigger__Group__020811 = new BitSet(new long[]{0x0800000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__1_in_rule__StatemachineTrigger__Group__020814 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__1__Impl_in_rule__StatemachineTrigger__Group__120872 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000000300000L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__2_in_rule__StatemachineTrigger__Group__120875 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_59_in_rule__StatemachineTrigger__Group__1__Impl20903 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__2__Impl_in_rule__StatemachineTrigger__Group__220934 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000000300000L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__3_in_rule__StatemachineTrigger__Group__220937 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__TriggersAssignment_2_in_rule__StatemachineTrigger__Group__2__Impl20964 = new BitSet(new long[]{0x0000000000000012L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__3__Impl_in_rule__StatemachineTrigger__Group__320995 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000000300000L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__4_in_rule__StatemachineTrigger__Group__320998 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_3__0_in_rule__StatemachineTrigger__Group__3__Impl21025 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__4__Impl_in_rule__StatemachineTrigger__Group__421056 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L,0x0000000000010000L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__5_in_rule__StatemachineTrigger__Group__421059 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_148_in_rule__StatemachineTrigger__Group__4__Impl21087 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__5__Impl_in_rule__StatemachineTrigger__Group__521118 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L,0x0000000000010000L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__6_in_rule__StatemachineTrigger__Group__521121 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_5__0_in_rule__StatemachineTrigger__Group__5__Impl21148 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__6__Impl_in_rule__StatemachineTrigger__Group__621179 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x4E5E7FD781C00080L,0x000000002FE12231L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__7_in_rule__StatemachineTrigger__Group__621182 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineTrigger__Group__6__Impl21210 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__7__Impl_in_rule__StatemachineTrigger__Group__721241 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x4E5E7FD781C00080L,0x000000002FE12231L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__8_in_rule__StatemachineTrigger__Group__721244 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets010 {
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__ActionsAssignment_7_in_rule__StatemachineTrigger__Group__7__Impl21271 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x4E5E7FD781C00000L,0x000000002FE12231L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group__8__Impl_in_rule__StatemachineTrigger__Group__821302 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineTrigger__Group__8__Impl21330 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_3__0__Impl_in_rule__StatemachineTrigger__Group_3__021379 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_3__1_in_rule__StatemachineTrigger__Group_3__021382 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_149_in_rule__StatemachineTrigger__Group_3__0__Impl21410 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_3__1__Impl_in_rule__StatemachineTrigger__Group_3__121441 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000000000000100L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_3__2_in_rule__StatemachineTrigger__Group_3__121444 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineTrigger__Group_3__1__Impl21472 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_3__2__Impl_in_rule__StatemachineTrigger__Group_3__221503 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000000000000100L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_3__3_in_rule__StatemachineTrigger__Group_3__221506 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__GuardsAssignment_3_2_in_rule__StatemachineTrigger__Group_3__2__Impl21533 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_3__3__Impl_in_rule__StatemachineTrigger__Group_3__321564 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineTrigger__Group_3__3__Impl21592 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_5__0__Impl_in_rule__StatemachineTrigger__Group_5__021631 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_5__1_in_rule__StatemachineTrigger__Group_5__021634 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__HasTransitionAssignment_5_0_in_rule__StatemachineTrigger__Group_5__0__Impl21661 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__Group_5__1__Impl_in_rule__StatemachineTrigger__Group_5__121691 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineTrigger__TransitionAssignment_5_1_in_rule__StatemachineTrigger__Group_5__1__Impl21718 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__Group__0__Impl_in_rule__StatemachineActionPeripheralBlinkRate__Group__021752 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__Group__1_in_rule__StatemachineActionPeripheralBlinkRate__Group__021755 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_150_in_rule__StatemachineActionPeripheralBlinkRate__Group__0__Impl21783 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__Group__1__Impl_in_rule__StatemachineActionPeripheralBlinkRate__Group__121814 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__Group__2_in_rule__StatemachineActionPeripheralBlinkRate__Group__121817 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__BlinkRateAssignment_1_in_rule__StatemachineActionPeripheralBlinkRate__Group__1__Impl21844 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__Group__2__Impl_in_rule__StatemachineActionPeripheralBlinkRate__Group__221874 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__Group__3_in_rule__StatemachineActionPeripheralBlinkRate__Group__221877 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralBlinkRate__Group__2__Impl21905 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__Group__3__Impl_in_rule__StatemachineActionPeripheralBlinkRate__Group__321936 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralBlinkRate__DeviceAssignment_3_in_rule__StatemachineActionPeripheralBlinkRate__Group__3__Impl21963 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralClear__Group__0__Impl_in_rule__StatemachineActionPeripheralClear__Group__022001 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralClear__Group__1_in_rule__StatemachineActionPeripheralClear__Group__022004 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_151_in_rule__StatemachineActionPeripheralClear__Group__0__Impl22032 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralClear__Group__1__Impl_in_rule__StatemachineActionPeripheralClear__Group__122063 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralClear__DeviceAssignment_1_in_rule__StatemachineActionPeripheralClear__Group__1__Impl22090 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__0__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__022124 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__1_in_rule__StatemachineActionPeripheralCreateWindow__Group__022127 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_152_in_rule__StatemachineActionPeripheralCreateWindow__Group__0__Impl22155 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__1__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__122186 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__2_in_rule__StatemachineActionPeripheralCreateWindow__Group__122189 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_153_in_rule__StatemachineActionPeripheralCreateWindow__Group__1__Impl22217 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__2__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__222248 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000004000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__3_in_rule__StatemachineActionPeripheralCreateWindow__Group__222251 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__ViewportRowAssignment_2_in_rule__StatemachineActionPeripheralCreateWindow__Group__2__Impl22278 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__3__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__322308 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__4_in_rule__StatemachineActionPeripheralCreateWindow__Group__322311 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_154_in_rule__StatemachineActionPeripheralCreateWindow__Group__3__Impl22339 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__4__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__422370 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000008000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__5_in_rule__StatemachineActionPeripheralCreateWindow__Group__422373 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__ViewportColumnAssignment_4_in_rule__StatemachineActionPeripheralCreateWindow__Group__4__Impl22400 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__5__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__522430 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__6_in_rule__StatemachineActionPeripheralCreateWindow__Group__522433 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_155_in_rule__StatemachineActionPeripheralCreateWindow__Group__5__Impl22461 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__6__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__622492 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000010000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__7_in_rule__StatemachineActionPeripheralCreateWindow__Group__622495 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__ViewportHeightAssignment_6_in_rule__StatemachineActionPeripheralCreateWindow__Group__6__Impl22522 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__7__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__722552 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__8_in_rule__StatemachineActionPeripheralCreateWindow__Group__722555 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_156_in_rule__StatemachineActionPeripheralCreateWindow__Group__7__Impl22583 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__8__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__822614 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000020000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__9_in_rule__StatemachineActionPeripheralCreateWindow__Group__822617 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__ViewportWidthAssignment_8_in_rule__StatemachineActionPeripheralCreateWindow__Group__8__Impl22644 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__9__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__922674 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__10_in_rule__StatemachineActionPeripheralCreateWindow__Group__922677 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_157_in_rule__StatemachineActionPeripheralCreateWindow__Group__9__Impl22705 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__10__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__1022736 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000040000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__11_in_rule__StatemachineActionPeripheralCreateWindow__Group__1022739 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__WindowHeightAssignment_10_in_rule__StatemachineActionPeripheralCreateWindow__Group__10__Impl22766 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__11__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__1122796 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__12_in_rule__StatemachineActionPeripheralCreateWindow__Group__1122799 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_158_in_rule__StatemachineActionPeripheralCreateWindow__Group__11__Impl22827 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__12__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__1222858 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__13_in_rule__StatemachineActionPeripheralCreateWindow__Group__1222861 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__WindowWidthAssignment_12_in_rule__StatemachineActionPeripheralCreateWindow__Group__12__Impl22888 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__13__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__1322918 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__14_in_rule__StatemachineActionPeripheralCreateWindow__Group__1322921 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralCreateWindow__Group__13__Impl22949 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__Group__14__Impl_in_rule__StatemachineActionPeripheralCreateWindow__Group__1422980 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCreateWindow__DeviceAssignment_14_in_rule__StatemachineActionPeripheralCreateWindow__Group__14__Impl23007 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__Group__0__Impl_in_rule__StatemachineActionPeripheralCursorType__Group__023067 = new BitSet(new long[]{0x0000000000000000L,0x0000000000FF0000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__Group__1_in_rule__StatemachineActionPeripheralCursorType__Group__023070 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_159_in_rule__StatemachineActionPeripheralCursorType__Group__0__Impl23098 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__Group__1__Impl_in_rule__StatemachineActionPeripheralCursorType__Group__123129 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__Group__2_in_rule__StatemachineActionPeripheralCursorType__Group__123132 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__CursorTypeAssignment_1_in_rule__StatemachineActionPeripheralCursorType__Group__1__Impl23159 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__Group__2__Impl_in_rule__StatemachineActionPeripheralCursorType__Group__223189 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__Group__3_in_rule__StatemachineActionPeripheralCursorType__Group__223192 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralCursorType__Group__2__Impl23220 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__Group__3__Impl_in_rule__StatemachineActionPeripheralCursorType__Group__323251 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralCursorType__DeviceAssignment_3_in_rule__StatemachineActionPeripheralCursorType__Group__3__Impl23278 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDestroyWindow__Group__0__Impl_in_rule__StatemachineActionPeripheralDestroyWindow__Group__023316 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDestroyWindow__Group__1_in_rule__StatemachineActionPeripheralDestroyWindow__Group__023319 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_160_in_rule__StatemachineActionPeripheralDestroyWindow__Group__0__Impl23347 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDestroyWindow__Group__1__Impl_in_rule__StatemachineActionPeripheralDestroyWindow__Group__123378 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDestroyWindow__DeviceAssignment_1_in_rule__StatemachineActionPeripheralDestroyWindow__Group__1__Impl23405 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__Group__0__Impl_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__023439 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__Group__1_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__023442 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_161_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__0__Impl23470 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__Group__1__Impl_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__123501 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__Group__2_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__123504 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets011 {
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__BrightnessAssignment_1_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__1__Impl23531 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__Group__2__Impl_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__223561 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__Group__3_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__223564 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__2__Impl23592 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__Group__3__Impl_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__323623 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDeviceBrightness__DeviceAssignment_3_in_rule__StatemachineActionPeripheralDeviceBrightness__Group__3__Impl23650 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__0__Impl_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__023688 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__1_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__023691 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_162_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__0__Impl23719 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__1__Impl_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__123750 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__2_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__123753 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_163_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__1__Impl23781 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__2__Impl_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__223812 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__3_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__223815 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__BitmapIdAssignment_2_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__2__Impl23842 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__3__Impl_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__323872 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__4_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__323875 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__3__Impl23903 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__Group__4__Impl_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__423934 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayBitmap__DeviceAssignment_4_in_rule__StatemachineActionPeripheralDisplayBitmap__Group__4__Impl23961 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__0__Impl_in_rule__StatemachineActionPeripheralDisplayText__Group__024001 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000002000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__1_in_rule__StatemachineActionPeripheralDisplayText__Group__024004 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_164_in_rule__StatemachineActionPeripheralDisplayText__Group__0__Impl24032 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__1__Impl_in_rule__StatemachineActionPeripheralDisplayText__Group__124063 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__2_in_rule__StatemachineActionPeripheralDisplayText__Group__124066 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_165_in_rule__StatemachineActionPeripheralDisplayText__Group__1__Impl24094 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__2__Impl_in_rule__StatemachineActionPeripheralDisplayText__Group__224125 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__3_in_rule__StatemachineActionPeripheralDisplayText__Group__224128 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__TextAssignment_2_in_rule__StatemachineActionPeripheralDisplayText__Group__2__Impl24155 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__3__Impl_in_rule__StatemachineActionPeripheralDisplayText__Group__324185 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__4_in_rule__StatemachineActionPeripheralDisplayText__Group__324188 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group_3__0_in_rule__StatemachineActionPeripheralDisplayText__Group__3__Impl24215 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__4__Impl_in_rule__StatemachineActionPeripheralDisplayText__Group__424246 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__5_in_rule__StatemachineActionPeripheralDisplayText__Group__424249 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralDisplayText__Group__4__Impl24277 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group__5__Impl_in_rule__StatemachineActionPeripheralDisplayText__Group__524308 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__DeviceAssignment_5_in_rule__StatemachineActionPeripheralDisplayText__Group__5__Impl24335 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group_3__0__Impl_in_rule__StatemachineActionPeripheralDisplayText__Group_3__024377 = new BitSet(new long[]{0x0000000000000000L,0x0000000180A00000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group_3__1_in_rule__StatemachineActionPeripheralDisplayText__Group_3__024380 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__HasTypeAssignment_3_0_in_rule__StatemachineActionPeripheralDisplayText__Group_3__0__Impl24407 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__Group_3__1__Impl_in_rule__StatemachineActionPeripheralDisplayText__Group_3__124437 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayText__TextTypeAssignment_3_1_in_rule__StatemachineActionPeripheralDisplayText__Group_3__1__Impl24464 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__0__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__024498 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000002000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__1_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__024501 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_166_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__0__Impl24529 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__1__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__124560 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__2_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__124563 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_165_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__1__Impl24591 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__2__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__224622 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__3_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__224625 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__TextAssignment_2_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__2__Impl24652 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__3__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__324682 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__4_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__324685 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_153_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__3__Impl24713 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__4__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__424744 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000004000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__5_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__424747 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__RowAssignment_4_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__4__Impl24774 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__5__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__524804 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__6_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__524807 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_154_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__5__Impl24835 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__6__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__624866 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__7_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__624869 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__ColumnAssignment_6_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__6__Impl24896 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__7__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__724926 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__8_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__724929 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__0_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__7__Impl24956 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__8__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__824987 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__9_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__824990 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__8__Impl25018 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group__9__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__925049 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__DeviceAssignment_9_in_rule__StatemachineActionPeripheralDisplayTextAt__Group__9__Impl25076 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__0__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__025126 = new BitSet(new long[]{0x0000000000000000L,0x0000000180A00000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__1_in_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__025129 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__HasTypeAssignment_7_0_in_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__0__Impl25156 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__1__Impl_in_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__125186 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralDisplayTextAt__TextTypeAssignment_7_1_in_rule__StatemachineActionPeripheralDisplayTextAt__Group_7__1__Impl25213 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__Group__0__Impl_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__025247 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__Group__1_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__025250 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_167_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__0__Impl25278 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__Group__1__Impl_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__125309 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__Group__2_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__125312 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__WaitAssignment_1_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__1__Impl25339 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__Group__2__Impl_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__225369 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__Group__3_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__225372 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__2__Impl25400 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__Group__3__Impl_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__325431 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralInterCharacterWait__DeviceAssignment_3_in_rule__StatemachineActionPeripheralInterCharacterWait__Group__3__Impl25458 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__Group__0__Impl_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__025496 = new BitSet(new long[]{0x0000000000000000L,0x0000000060000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__Group__1_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__025499 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_168_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__0__Impl25527 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__Group__1__Impl_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__125558 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__Group__2_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__125561 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__FormatAssignment_1_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__1__Impl25588 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__Group__2__Impl_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__225618 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__Group__3_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__225621 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__2__Impl25649 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__Group__3__Impl_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__325680 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeFormat__DeviceAssignment_3_in_rule__StatemachineActionPeripheralMarqueeFormat__Group__3__Impl25707 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__0__Impl_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__025745 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__1_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__025748 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets012 {
+        public static final BitSet FOLLOW_169_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__0__Impl25776 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__1__Impl_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__125807 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__2_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__125810 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__WaitAssignment_1_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__1__Impl25837 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__2__Impl_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__225867 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__3_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__225870 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__2__Impl25898 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__3__Impl_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__325929 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeRepeatWait__DeviceAssignment_3_in_rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__3__Impl25956 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__Group__0__Impl_in_rule__StatemachineActionPeripheralMarqueeType__Group__025994 = new BitSet(new long[]{0x0000000000000000L,0x000000001F010000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__Group__1_in_rule__StatemachineActionPeripheralMarqueeType__Group__025997 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_170_in_rule__StatemachineActionPeripheralMarqueeType__Group__0__Impl26025 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__Group__1__Impl_in_rule__StatemachineActionPeripheralMarqueeType__Group__126056 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__Group__2_in_rule__StatemachineActionPeripheralMarqueeType__Group__126059 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__MarqueeTypeAssignment_1_in_rule__StatemachineActionPeripheralMarqueeType__Group__1__Impl26086 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__Group__2__Impl_in_rule__StatemachineActionPeripheralMarqueeType__Group__226116 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__Group__3_in_rule__StatemachineActionPeripheralMarqueeType__Group__226119 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralMarqueeType__Group__2__Impl26147 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__Group__3__Impl_in_rule__StatemachineActionPeripheralMarqueeType__Group__326178 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeType__DeviceAssignment_3_in_rule__StatemachineActionPeripheralMarqueeType__Group__3__Impl26205 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__0__Impl_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__026243 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__1_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__026246 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_171_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__0__Impl26274 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__1__Impl_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__126305 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__2_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__126308 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__WaitAssignment_1_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__1__Impl26335 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__2__Impl_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__226365 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__3_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__226368 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__2__Impl26396 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__3__Impl_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__326427 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralMarqueeUnitWait__DeviceAssignment_3_in_rule__StatemachineActionPeripheralMarqueeUnitWait__Group__3__Impl26454 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__0__Impl_in_rule__StatemachineActionPeripheralScroll__Group__026492 = new BitSet(new long[]{0x0000000000000000L,0x000000000F000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__1_in_rule__StatemachineActionPeripheralScroll__Group__026495 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_172_in_rule__StatemachineActionPeripheralScroll__Group__0__Impl26523 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__1__Impl_in_rule__StatemachineActionPeripheralScroll__Group__126554 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__2_in_rule__StatemachineActionPeripheralScroll__Group__126557 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__DirectionAssignment_1_in_rule__StatemachineActionPeripheralScroll__Group__1__Impl26584 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__2__Impl_in_rule__StatemachineActionPeripheralScroll__Group__226614 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__3_in_rule__StatemachineActionPeripheralScroll__Group__226617 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__UnitsAssignment_2_in_rule__StatemachineActionPeripheralScroll__Group__2__Impl26644 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__3__Impl_in_rule__StatemachineActionPeripheralScroll__Group__326674 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__4_in_rule__StatemachineActionPeripheralScroll__Group__326677 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralScroll__Group__3__Impl26705 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__Group__4__Impl_in_rule__StatemachineActionPeripheralScroll__Group__426736 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralScroll__DeviceAssignment_4_in_rule__StatemachineActionPeripheralScroll__Group__4__Impl26763 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralOpenDrawer__Group__0__Impl_in_rule__StatemachineActionPeripheralOpenDrawer__Group__026803 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralOpenDrawer__Group__1_in_rule__StatemachineActionPeripheralOpenDrawer__Group__026806 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_173_in_rule__StatemachineActionPeripheralOpenDrawer__Group__0__Impl26834 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralOpenDrawer__Group__1__Impl_in_rule__StatemachineActionPeripheralOpenDrawer__Group__126865 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralOpenDrawer__DeviceAssignment_1_in_rule__StatemachineActionPeripheralOpenDrawer__Group__1__Impl26892 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__0__Impl_in_rule__StatemachineActionPeripheralPrintBarcode__Group__026926 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000800000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__1_in_rule__StatemachineActionPeripheralPrintBarcode__Group__026929 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_174_in_rule__StatemachineActionPeripheralPrintBarcode__Group__0__Impl26957 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__1__Impl_in_rule__StatemachineActionPeripheralPrintBarcode__Group__126988 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__2_in_rule__StatemachineActionPeripheralPrintBarcode__Group__126991 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_175_in_rule__StatemachineActionPeripheralPrintBarcode__Group__1__Impl27019 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__2__Impl_in_rule__StatemachineActionPeripheralPrintBarcode__Group__227050 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0001000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__3_in_rule__StatemachineActionPeripheralPrintBarcode__Group__227053 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__DataAssignment_2_in_rule__StatemachineActionPeripheralPrintBarcode__Group__2__Impl27080 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__3__Impl_in_rule__StatemachineActionPeripheralPrintBarcode__Group__327110 = new BitSet(new long[]{0x0000000000000000L,0xFFFFFFFE00000000L,0x000000000000001FL});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__4_in_rule__StatemachineActionPeripheralPrintBarcode__Group__327113 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_176_in_rule__StatemachineActionPeripheralPrintBarcode__Group__3__Impl27141 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__4__Impl_in_rule__StatemachineActionPeripheralPrintBarcode__Group__427172 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__5_in_rule__StatemachineActionPeripheralPrintBarcode__Group__427175 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__BarcodeTypeAssignment_4_in_rule__StatemachineActionPeripheralPrintBarcode__Group__4__Impl27202 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__5__Impl_in_rule__StatemachineActionPeripheralPrintBarcode__Group__527232 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__6_in_rule__StatemachineActionPeripheralPrintBarcode__Group__527235 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPrintBarcode__Group__5__Impl27263 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__Group__6__Impl_in_rule__StatemachineActionPeripheralPrintBarcode__Group__627294 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBarcode__DeviceAssignment_6_in_rule__StatemachineActionPeripheralPrintBarcode__Group__6__Impl27321 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__0__Impl_in_rule__StatemachineActionPeripheralPrintBitmap__Group__027365 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__1_in_rule__StatemachineActionPeripheralPrintBitmap__Group__027368 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_177_in_rule__StatemachineActionPeripheralPrintBitmap__Group__0__Impl27396 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__1__Impl_in_rule__StatemachineActionPeripheralPrintBitmap__Group__127427 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__2_in_rule__StatemachineActionPeripheralPrintBitmap__Group__127430 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_163_in_rule__StatemachineActionPeripheralPrintBitmap__Group__1__Impl27458 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__2__Impl_in_rule__StatemachineActionPeripheralPrintBitmap__Group__227489 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__3_in_rule__StatemachineActionPeripheralPrintBitmap__Group__227492 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__BitmapIdAssignment_2_in_rule__StatemachineActionPeripheralPrintBitmap__Group__2__Impl27519 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__3__Impl_in_rule__StatemachineActionPeripheralPrintBitmap__Group__327549 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__4_in_rule__StatemachineActionPeripheralPrintBitmap__Group__327552 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPrintBitmap__Group__3__Impl27580 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__Group__4__Impl_in_rule__StatemachineActionPeripheralPrintBitmap__Group__427611 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintBitmap__DeviceAssignment_4_in_rule__StatemachineActionPeripheralPrintBitmap__Group__4__Impl27638 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__0__Impl_in_rule__StatemachineActionPeripheralPrintCut__Group__027678 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000002000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__1_in_rule__StatemachineActionPeripheralPrintCut__Group__027681 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_178_in_rule__StatemachineActionPeripheralPrintCut__Group__0__Impl27709 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__1__Impl_in_rule__StatemachineActionPeripheralPrintCut__Group__127740 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__2_in_rule__StatemachineActionPeripheralPrintCut__Group__127743 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_165_in_rule__StatemachineActionPeripheralPrintCut__Group__1__Impl27771 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__2__Impl_in_rule__StatemachineActionPeripheralPrintCut__Group__227802 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__3_in_rule__StatemachineActionPeripheralPrintCut__Group__227805 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__TextAssignment_2_in_rule__StatemachineActionPeripheralPrintCut__Group__2__Impl27832 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__3__Impl_in_rule__StatemachineActionPeripheralPrintCut__Group__327862 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__4_in_rule__StatemachineActionPeripheralPrintCut__Group__327865 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPrintCut__Group__3__Impl27893 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__Group__4__Impl_in_rule__StatemachineActionPeripheralPrintCut__Group__427924 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintCut__DeviceAssignment_4_in_rule__StatemachineActionPeripheralPrintCut__Group__4__Impl27951 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__0__Impl_in_rule__StatemachineActionPeripheralPrintNormal__Group__027991 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000002000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__1_in_rule__StatemachineActionPeripheralPrintNormal__Group__027994 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets013 {
+        public static final BitSet FOLLOW_179_in_rule__StatemachineActionPeripheralPrintNormal__Group__0__Impl28022 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__1__Impl_in_rule__StatemachineActionPeripheralPrintNormal__Group__128053 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__2_in_rule__StatemachineActionPeripheralPrintNormal__Group__128056 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_165_in_rule__StatemachineActionPeripheralPrintNormal__Group__1__Impl28084 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__2__Impl_in_rule__StatemachineActionPeripheralPrintNormal__Group__228115 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__3_in_rule__StatemachineActionPeripheralPrintNormal__Group__228118 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__TextAssignment_2_in_rule__StatemachineActionPeripheralPrintNormal__Group__2__Impl28145 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__3__Impl_in_rule__StatemachineActionPeripheralPrintNormal__Group__328175 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__4_in_rule__StatemachineActionPeripheralPrintNormal__Group__328178 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPrintNormal__Group__3__Impl28206 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__Group__4__Impl_in_rule__StatemachineActionPeripheralPrintNormal__Group__428237 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintNormal__DeviceAssignment_4_in_rule__StatemachineActionPeripheralPrintNormal__Group__4__Impl28264 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__0__Impl_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__028304 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__1_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__028307 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_180_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__0__Impl28335 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__1__Impl_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__128366 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__2_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__128369 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_163_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__1__Impl28397 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__2__Impl_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__228428 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0020000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__3_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__228431 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__BitmapIdAssignment_2_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__2__Impl28458 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__3__Impl_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__328488 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__4_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__328491 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_181_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__3__Impl28519 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__4__Impl_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__428550 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__5_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__428553 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__NameAssignment_4_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__4__Impl28580 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__5__Impl_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__528610 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__6_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__528613 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__5__Impl28641 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__6__Impl_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__628672 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintRegisterBitmap__DeviceAssignment_6_in_rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__6__Impl28699 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__0__Impl_in_rule__StatemachineActionPeripheralPTOpen__Group__028743 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0080000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__1_in_rule__StatemachineActionPeripheralPTOpen__Group__028746 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_182_in_rule__StatemachineActionPeripheralPTOpen__Group__0__Impl28774 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__1__Impl_in_rule__StatemachineActionPeripheralPTOpen__Group__128805 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__2_in_rule__StatemachineActionPeripheralPTOpen__Group__128808 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_183_in_rule__StatemachineActionPeripheralPTOpen__Group__1__Impl28836 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__2__Impl_in_rule__StatemachineActionPeripheralPTOpen__Group__228867 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0100000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__3_in_rule__StatemachineActionPeripheralPTOpen__Group__228870 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__HostAssignment_2_in_rule__StatemachineActionPeripheralPTOpen__Group__2__Impl28897 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__3__Impl_in_rule__StatemachineActionPeripheralPTOpen__Group__328927 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__4_in_rule__StatemachineActionPeripheralPTOpen__Group__328930 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_184_in_rule__StatemachineActionPeripheralPTOpen__Group__3__Impl28958 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__4__Impl_in_rule__StatemachineActionPeripheralPTOpen__Group__428989 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__5_in_rule__StatemachineActionPeripheralPTOpen__Group__428992 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__PortAssignment_4_in_rule__StatemachineActionPeripheralPTOpen__Group__4__Impl29019 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__5__Impl_in_rule__StatemachineActionPeripheralPTOpen__Group__529049 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__6_in_rule__StatemachineActionPeripheralPTOpen__Group__529052 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPTOpen__Group__5__Impl29080 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__Group__6__Impl_in_rule__StatemachineActionPeripheralPTOpen__Group__629111 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTOpen__DeviceAssignment_6_in_rule__StatemachineActionPeripheralPTOpen__Group__6__Impl29138 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTClose__Group__0__Impl_in_rule__StatemachineActionPeripheralPTClose__Group__029182 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTClose__Group__1_in_rule__StatemachineActionPeripheralPTClose__Group__029185 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_185_in_rule__StatemachineActionPeripheralPTClose__Group__0__Impl29213 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTClose__Group__1__Impl_in_rule__StatemachineActionPeripheralPTClose__Group__129244 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTClose__Group__2_in_rule__StatemachineActionPeripheralPTClose__Group__129247 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPTClose__Group__1__Impl29275 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTClose__Group__2__Impl_in_rule__StatemachineActionPeripheralPTClose__Group__229306 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTClose__DeviceAssignment_2_in_rule__StatemachineActionPeripheralPTClose__Group__2__Impl29333 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAcknowledge__Group__0__Impl_in_rule__StatemachineActionPeripheralPTAcknowledge__Group__029369 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAcknowledge__Group__1_in_rule__StatemachineActionPeripheralPTAcknowledge__Group__029372 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_186_in_rule__StatemachineActionPeripheralPTAcknowledge__Group__0__Impl29400 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAcknowledge__Group__1__Impl_in_rule__StatemachineActionPeripheralPTAcknowledge__Group__129431 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAcknowledge__Group__2_in_rule__StatemachineActionPeripheralPTAcknowledge__Group__129434 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPTAcknowledge__Group__1__Impl29462 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAcknowledge__Group__2__Impl_in_rule__StatemachineActionPeripheralPTAcknowledge__Group__229493 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAcknowledge__DeviceAssignment_2_in_rule__StatemachineActionPeripheralPTAcknowledge__Group__2__Impl29520 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__0__Impl_in_rule__StatemachineActionPeripheralPTReversal__Group__029556 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x1000000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__1_in_rule__StatemachineActionPeripheralPTReversal__Group__029559 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_187_in_rule__StatemachineActionPeripheralPTReversal__Group__0__Impl29587 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__1__Impl_in_rule__StatemachineActionPeripheralPTReversal__Group__129618 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__2_in_rule__StatemachineActionPeripheralPTReversal__Group__129621 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_188_in_rule__StatemachineActionPeripheralPTReversal__Group__1__Impl29649 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__2__Impl_in_rule__StatemachineActionPeripheralPTReversal__Group__229680 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x2000000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__3_in_rule__StatemachineActionPeripheralPTReversal__Group__229683 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__PasswordAssignment_2_in_rule__StatemachineActionPeripheralPTReversal__Group__2__Impl29710 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__3__Impl_in_rule__StatemachineActionPeripheralPTReversal__Group__329740 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__4_in_rule__StatemachineActionPeripheralPTReversal__Group__329743 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_189_in_rule__StatemachineActionPeripheralPTReversal__Group__3__Impl29771 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__4__Impl_in_rule__StatemachineActionPeripheralPTReversal__Group__429802 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__5_in_rule__StatemachineActionPeripheralPTReversal__Group__429805 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__ReceiptAssignment_4_in_rule__StatemachineActionPeripheralPTReversal__Group__4__Impl29832 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__5__Impl_in_rule__StatemachineActionPeripheralPTReversal__Group__529862 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__6_in_rule__StatemachineActionPeripheralPTReversal__Group__529865 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPTReversal__Group__5__Impl29893 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__Group__6__Impl_in_rule__StatemachineActionPeripheralPTReversal__Group__629924 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTReversal__DeviceAssignment_6_in_rule__StatemachineActionPeripheralPTReversal__Group__6__Impl29951 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__0__Impl_in_rule__StatemachineActionPeripheralPTRegistration__Group__029995 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x1000000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__1_in_rule__StatemachineActionPeripheralPTRegistration__Group__029998 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_190_in_rule__StatemachineActionPeripheralPTRegistration__Group__0__Impl30026 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__1__Impl_in_rule__StatemachineActionPeripheralPTRegistration__Group__130057 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__2_in_rule__StatemachineActionPeripheralPTRegistration__Group__130060 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_188_in_rule__StatemachineActionPeripheralPTRegistration__Group__1__Impl30088 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__2__Impl_in_rule__StatemachineActionPeripheralPTRegistration__Group__230119 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x8000000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__3_in_rule__StatemachineActionPeripheralPTRegistration__Group__230122 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__PasswordAssignment_2_in_rule__StatemachineActionPeripheralPTRegistration__Group__2__Impl30149 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__3__Impl_in_rule__StatemachineActionPeripheralPTRegistration__Group__330179 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__4_in_rule__StatemachineActionPeripheralPTRegistration__Group__330182 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_191_in_rule__StatemachineActionPeripheralPTRegistration__Group__3__Impl30210 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets014 {
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__4__Impl_in_rule__StatemachineActionPeripheralPTRegistration__Group__430241 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__5_in_rule__StatemachineActionPeripheralPTRegistration__Group__430244 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__ConfigurationAssignment_4_in_rule__StatemachineActionPeripheralPTRegistration__Group__4__Impl30271 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__5__Impl_in_rule__StatemachineActionPeripheralPTRegistration__Group__530301 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__6_in_rule__StatemachineActionPeripheralPTRegistration__Group__530304 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPTRegistration__Group__5__Impl30332 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__Group__6__Impl_in_rule__StatemachineActionPeripheralPTRegistration__Group__630363 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTRegistration__DeviceAssignment_6_in_rule__StatemachineActionPeripheralPTRegistration__Group__6__Impl30390 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__0__Impl_in_rule__StatemachineActionPeripheralPTAuthorization__Group__030434 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__1_in_rule__StatemachineActionPeripheralPTAuthorization__Group__030437 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_192_in_rule__StatemachineActionPeripheralPTAuthorization__Group__0__Impl30465 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__1__Impl_in_rule__StatemachineActionPeripheralPTAuthorization__Group__130496 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__2_in_rule__StatemachineActionPeripheralPTAuthorization__Group__130499 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_193_in_rule__StatemachineActionPeripheralPTAuthorization__Group__1__Impl30527 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__2__Impl_in_rule__StatemachineActionPeripheralPTAuthorization__Group__230558 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__3_in_rule__StatemachineActionPeripheralPTAuthorization__Group__230561 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__AmountAssignment_2_in_rule__StatemachineActionPeripheralPTAuthorization__Group__2__Impl30588 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__3__Impl_in_rule__StatemachineActionPeripheralPTAuthorization__Group__330618 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__4_in_rule__StatemachineActionPeripheralPTAuthorization__Group__330621 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionPeripheralPTAuthorization__Group__3__Impl30649 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__Group__4__Impl_in_rule__StatemachineActionPeripheralPTAuthorization__Group__430680 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTAuthorization__DeviceAssignment_4_in_rule__StatemachineActionPeripheralPTAuthorization__Group__4__Impl30707 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTResponse__Group__0__Impl_in_rule__StatemachineActionPeripheralPTResponse__Group__030747 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTResponse__Group__1_in_rule__StatemachineActionPeripheralPTResponse__Group__030750 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_194_in_rule__StatemachineActionPeripheralPTResponse__Group__0__Impl30778 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTResponse__Group__1__Impl_in_rule__StatemachineActionPeripheralPTResponse__Group__130809 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTResponse__Group__2_in_rule__StatemachineActionPeripheralPTResponse__Group__130812 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_195_in_rule__StatemachineActionPeripheralPTResponse__Group__1__Impl30840 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTResponse__Group__2__Impl_in_rule__StatemachineActionPeripheralPTResponse__Group__230871 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPTResponse__DeviceAssignment_2_in_rule__StatemachineActionPeripheralPTResponse__Group__2__Impl30898 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group__0__Impl_in_rule__StatemachineActionPeripheralPrintReport__Group__030934 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group__1_in_rule__StatemachineActionPeripheralPrintReport__Group__030937 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_196_in_rule__StatemachineActionPeripheralPrintReport__Group__0__Impl30965 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group__1__Impl_in_rule__StatemachineActionPeripheralPrintReport__Group__130996 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group__2_in_rule__StatemachineActionPeripheralPrintReport__Group__130999 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__ReportAssignment_1_in_rule__StatemachineActionPeripheralPrintReport__Group__1__Impl31026 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group__2__Impl_in_rule__StatemachineActionPeripheralPrintReport__Group__231056 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group_2__0_in_rule__StatemachineActionPeripheralPrintReport__Group__2__Impl31083 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group_2__0__Impl_in_rule__StatemachineActionPeripheralPrintReport__Group_2__031120 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group_2__1_in_rule__StatemachineActionPeripheralPrintReport__Group_2__031123 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__HasFilterAssignment_2_0_in_rule__StatemachineActionPeripheralPrintReport__Group_2__0__Impl31150 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__Group_2__1__Impl_in_rule__StatemachineActionPeripheralPrintReport__Group_2__131180 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionPeripheralPrintReport__KeyAssignment_2_1_in_rule__StatemachineActionPeripheralPrintReport__Group_2__1__Impl31207 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__0__Impl_in_rule__StatemachineOperation__Group__031241 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__1_in_rule__StatemachineOperation__Group__031244 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_197_in_rule__StatemachineOperation__Group__0__Impl31272 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__1__Impl_in_rule__StatemachineOperation__Group__131303 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__2_in_rule__StatemachineOperation__Group__131306 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__OperationAssignment_1_in_rule__StatemachineOperation__Group__1__Impl31333 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__2__Impl_in_rule__StatemachineOperation__Group__231363 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000001E9084L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__3_in_rule__StatemachineOperation__Group__231366 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_198_in_rule__StatemachineOperation__Group__2__Impl31394 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__3__Impl_in_rule__StatemachineOperation__Group__331425 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000001E9084L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__4_in_rule__StatemachineOperation__Group__331428 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__FirstAssignment_3_in_rule__StatemachineOperation__Group__3__Impl31455 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__4__Impl_in_rule__StatemachineOperation__Group__431486 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000001E9084L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__5_in_rule__StatemachineOperation__Group__431489 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__MoreAssignment_4_in_rule__StatemachineOperation__Group__4__Impl31516 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__StatemachineOperation__Group__5__Impl_in_rule__StatemachineOperation__Group__531547 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_199_in_rule__StatemachineOperation__Group__5__Impl31575 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group__0__Impl_in_rule__StatemachineGuard__Group__031618 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group__1_in_rule__StatemachineGuard__Group__031621 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_200_in_rule__StatemachineGuard__Group__0__Impl31649 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group__1__Impl_in_rule__StatemachineGuard__Group__131680 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group__2_in_rule__StatemachineGuard__Group__131683 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__GuardAssignment_1_in_rule__StatemachineGuard__Group__1__Impl31710 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group__2__Impl_in_rule__StatemachineGuard__Group__231740 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__0_in_rule__StatemachineGuard__Group__2__Impl31767 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__0__Impl_in_rule__StatemachineGuard__Group_2__031804 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__1_in_rule__StatemachineGuard__Group_2__031807 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__HasOnFailAssignment_2_0_in_rule__StatemachineGuard__Group_2__0__Impl31834 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__1__Impl_in_rule__StatemachineGuard__Group_2__131864 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__2_in_rule__StatemachineGuard__Group_2__131867 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_201_in_rule__StatemachineGuard__Group_2__1__Impl31895 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__2__Impl_in_rule__StatemachineGuard__Group_2__231926 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000400L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__3_in_rule__StatemachineGuard__Group_2__231929 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__OnFailCaptionAssignment_2_2_in_rule__StatemachineGuard__Group_2__2__Impl31956 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__3__Impl_in_rule__StatemachineGuard__Group_2__331986 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__4_in_rule__StatemachineGuard__Group_2__331989 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_202_in_rule__StatemachineGuard__Group_2__3__Impl32017 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__4__Impl_in_rule__StatemachineGuard__Group_2__432048 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__5_in_rule__StatemachineGuard__Group_2__432051 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__OnFailDescriptionAssignment_2_4_in_rule__StatemachineGuard__Group_2__4__Impl32078 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__5__Impl_in_rule__StatemachineGuard__Group_2__532108 = new BitSet(new long[]{0x0000000000000000L,0x000000000000F800L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__6_in_rule__StatemachineGuard__Group_2__532111 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_203_in_rule__StatemachineGuard__Group_2__5__Impl32139 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__Group_2__6__Impl_in_rule__StatemachineGuard__Group_2__632170 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineGuard__OnFailTypeAssignment_2_6_in_rule__StatemachineGuard__Group_2__6__Impl32197 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__0__Impl_in_rule__StatemachineFunction__Group__032241 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__1_in_rule__StatemachineFunction__Group__032244 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_204_in_rule__StatemachineFunction__Group__0__Impl32272 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__1__Impl_in_rule__StatemachineFunction__Group__132303 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__2_in_rule__StatemachineFunction__Group__132306 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__FunctionAssignment_1_in_rule__StatemachineFunction__Group__1__Impl32333 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__2__Impl_in_rule__StatemachineFunction__Group__232363 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000001E9084L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__3_in_rule__StatemachineFunction__Group__232366 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_198_in_rule__StatemachineFunction__Group__2__Impl32394 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__3__Impl_in_rule__StatemachineFunction__Group__332425 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000001E9084L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__4_in_rule__StatemachineFunction__Group__332428 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__FirstAssignment_3_in_rule__StatemachineFunction__Group__3__Impl32455 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets015 {
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__4__Impl_in_rule__StatemachineFunction__Group__432486 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000001E9084L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__5_in_rule__StatemachineFunction__Group__432489 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__MoreAssignment_4_in_rule__StatemachineFunction__Group__4__Impl32516 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__StatemachineFunction__Group__5__Impl_in_rule__StatemachineFunction__Group__532547 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_199_in_rule__StatemachineFunction__Group__5__Impl32575 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__0__Impl_in_rule__StatemachineStorage__Group__032618 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__1_in_rule__StatemachineStorage__Group__032621 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_205_in_rule__StatemachineStorage__Group__0__Impl32649 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__1__Impl_in_rule__StatemachineStorage__Group__132680 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000004000L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__2_in_rule__StatemachineStorage__Group__132683 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__ContentAssignment_1_in_rule__StatemachineStorage__Group__1__Impl32710 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__2__Impl_in_rule__StatemachineStorage__Group__232740 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__3_in_rule__StatemachineStorage__Group__232743 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_206_in_rule__StatemachineStorage__Group__2__Impl32771 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__3__Impl_in_rule__StatemachineStorage__Group__332802 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__4_in_rule__StatemachineStorage__Group__332805 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__KeyAssignment_3_in_rule__StatemachineStorage__Group__3__Impl32832 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__4__Impl_in_rule__StatemachineStorage__Group__432862 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__5_in_rule__StatemachineStorage__Group__432865 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__StatemachineStorage__Group__4__Impl32893 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__Group__5__Impl_in_rule__StatemachineStorage__Group__532924 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorage__AttributeAssignment_5_in_rule__StatemachineStorage__Group__5__Impl32951 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__0__Impl_in_rule__StatemachineStorageRetrieve__Group__032993 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__1_in_rule__StatemachineStorageRetrieve__Group__032996 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_207_in_rule__StatemachineStorageRetrieve__Group__0__Impl33024 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__1__Impl_in_rule__StatemachineStorageRetrieve__Group__133055 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__2_in_rule__StatemachineStorageRetrieve__Group__133058 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_195_in_rule__StatemachineStorageRetrieve__Group__1__Impl33086 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__2__Impl_in_rule__StatemachineStorageRetrieve__Group__233117 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__3_in_rule__StatemachineStorageRetrieve__Group__233120 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__KeyAssignment_2_in_rule__StatemachineStorageRetrieve__Group__2__Impl33147 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__3__Impl_in_rule__StatemachineStorageRetrieve__Group__333177 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__4_in_rule__StatemachineStorageRetrieve__Group__333180 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__StatemachineStorageRetrieve__Group__3__Impl33208 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__Group__4__Impl_in_rule__StatemachineStorageRetrieve__Group__433239 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieve__AttributeAssignment_4_in_rule__StatemachineStorageRetrieve__Group__4__Impl33266 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__0__Impl_in_rule__StatemachineActionConditionalTransition__Group__033306 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__1_in_rule__StatemachineActionConditionalTransition__Group__033309 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_208_in_rule__StatemachineActionConditionalTransition__Group__0__Impl33337 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__1__Impl_in_rule__StatemachineActionConditionalTransition__Group__133368 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__2_in_rule__StatemachineActionConditionalTransition__Group__133371 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__TransitionAssignment_1_in_rule__StatemachineActionConditionalTransition__Group__1__Impl33398 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__2__Impl_in_rule__StatemachineActionConditionalTransition__Group__233428 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__3_in_rule__StatemachineActionConditionalTransition__Group__233431 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__GuardAssignment_2_in_rule__StatemachineActionConditionalTransition__Group__2__Impl33458 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__3__Impl_in_rule__StatemachineActionConditionalTransition__Group__333488 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x4E5E7FD781C00080L,0x000000002FE12231L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__4_in_rule__StatemachineActionConditionalTransition__Group__333491 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineActionConditionalTransition__Group__3__Impl33519 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__4__Impl_in_rule__StatemachineActionConditionalTransition__Group__433550 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x4E5E7FD781C00080L,0x000000002FE12231L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__5_in_rule__StatemachineActionConditionalTransition__Group__433553 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__ActionsAssignment_4_in_rule__StatemachineActionConditionalTransition__Group__4__Impl33580 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x4E5E7FD781C00000L,0x000000002FE12231L});
+        public static final BitSet FOLLOW_rule__StatemachineActionConditionalTransition__Group__5__Impl_in_rule__StatemachineActionConditionalTransition__Group__533611 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineActionConditionalTransition__Group__5__Impl33639 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvent__Group__0__Impl_in_rule__StatemachineActionFieldSourceEvent__Group__033682 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvent__Group__1_in_rule__StatemachineActionFieldSourceEvent__Group__033685 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvent__Group__1__Impl_in_rule__StatemachineActionFieldSourceEvent__Group__133743 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_143_in_rule__StatemachineActionFieldSourceEvent__Group__1__Impl33771 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslate__Group__0__Impl_in_rule__StatemachineActionFieldSourceTranslate__Group__033806 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslate__Group__1_in_rule__StatemachineActionFieldSourceTranslate__Group__033809 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_209_in_rule__StatemachineActionFieldSourceTranslate__Group__0__Impl33837 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslate__Group__1__Impl_in_rule__StatemachineActionFieldSourceTranslate__Group__133868 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslate__TextAssignment_1_in_rule__StatemachineActionFieldSourceTranslate__Group__1__Impl33895 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__Group__0__Impl_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__033929 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__Group__1_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__033932 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_210_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__0__Impl33960 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__Group__1__Impl_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__133991 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__Group__2_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__133994 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__DtoAssignment_1_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__1__Impl34021 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__Group__2__Impl_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__234051 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__Group__3_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__234054 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__2__Impl34082 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__Group__3__Impl_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__334113 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttribute__AttributeAssignment_3_in_rule__StatemachineActionFieldSourceDtoAttribute__Group__3__Impl34140 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceStringMore__Group__0__Impl_in_rule__StatemachineActionFieldSourceStringMore__Group__034178 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceStringMore__Group__1_in_rule__StatemachineActionFieldSourceStringMore__Group__034181 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceStringMore__Group__1__Impl_in_rule__StatemachineActionFieldSourceStringMore__Group__134239 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceStringMore__Group__2_in_rule__StatemachineActionFieldSourceStringMore__Group__134242 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__StatemachineActionFieldSourceStringMore__Group__1__Impl34270 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceStringMore__Group__2__Impl_in_rule__StatemachineActionFieldSourceStringMore__Group__234301 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceStringMore__TextAssignment_2_in_rule__StatemachineActionFieldSourceStringMore__Group__2__Impl34328 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceNumberMore__Group__0__Impl_in_rule__StatemachineActionFieldSourceNumberMore__Group__034364 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceNumberMore__Group__1_in_rule__StatemachineActionFieldSourceNumberMore__Group__034367 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceNumberMore__Group__1__Impl_in_rule__StatemachineActionFieldSourceNumberMore__Group__134425 = new BitSet(new long[]{0x0000000800000080L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceNumberMore__Group__2_in_rule__StatemachineActionFieldSourceNumberMore__Group__134428 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__StatemachineActionFieldSourceNumberMore__Group__1__Impl34456 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceNumberMore__Group__2__Impl_in_rule__StatemachineActionFieldSourceNumberMore__Group__234487 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceNumberMore__ValueAssignment_2_in_rule__StatemachineActionFieldSourceNumberMore__Group__2__Impl34514 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvaluateMore__Group__0__Impl_in_rule__StatemachineActionFieldSourceEvaluateMore__Group__034550 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvaluateMore__Group__1_in_rule__StatemachineActionFieldSourceEvaluateMore__Group__034553 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvaluateMore__Group__1__Impl_in_rule__StatemachineActionFieldSourceEvaluateMore__Group__134611 = new BitSet(new long[]{0xE000000000000000L,0x00000000000007FFL});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvaluateMore__Group__2_in_rule__StatemachineActionFieldSourceEvaluateMore__Group__134614 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__StatemachineActionFieldSourceEvaluateMore__Group__1__Impl34642 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvaluateMore__Group__2__Impl_in_rule__StatemachineActionFieldSourceEvaluateMore__Group__234673 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceEvaluateMore__EvaluationtypeAssignment_2_in_rule__StatemachineActionFieldSourceEvaluateMore__Group__2__Impl34700 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__Group__0__Impl_in_rule__StatemachineActionFieldSourceTranslateMore__Group__034736 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__Group__1_in_rule__StatemachineActionFieldSourceTranslateMore__Group__034739 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__Group__1__Impl_in_rule__StatemachineActionFieldSourceTranslateMore__Group__134797 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000020000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__Group__2_in_rule__StatemachineActionFieldSourceTranslateMore__Group__134800 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__StatemachineActionFieldSourceTranslateMore__Group__1__Impl34828 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__Group__2__Impl_in_rule__StatemachineActionFieldSourceTranslateMore__Group__234859 = new BitSet(new long[]{0x0000000000000020L});
+    }
+
+    protected static class FollowSets016 {
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__Group__3_in_rule__StatemachineActionFieldSourceTranslateMore__Group__234862 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_209_in_rule__StatemachineActionFieldSourceTranslateMore__Group__2__Impl34890 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__Group__3__Impl_in_rule__StatemachineActionFieldSourceTranslateMore__Group__334921 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceTranslateMore__TextAssignment_3_in_rule__StatemachineActionFieldSourceTranslateMore__Group__3__Impl34948 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__Group__0__Impl_in_rule__StatemachineActionFieldGetMore__Group__034986 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__Group__1_in_rule__StatemachineActionFieldGetMore__Group__034989 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__Group__1__Impl_in_rule__StatemachineActionFieldGetMore__Group__135047 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__Group__2_in_rule__StatemachineActionFieldGetMore__Group__135050 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__StatemachineActionFieldGetMore__Group__1__Impl35078 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__Group__2__Impl_in_rule__StatemachineActionFieldGetMore__Group__235109 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__Group__3_in_rule__StatemachineActionFieldGetMore__Group__235112 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_211_in_rule__StatemachineActionFieldGetMore__Group__2__Impl35140 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__Group__3__Impl_in_rule__StatemachineActionFieldGetMore__Group__335171 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGetMore__AttributeAssignment_3_in_rule__StatemachineActionFieldGetMore__Group__3__Impl35198 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__Group__0__Impl_in_rule__StatemachineOperationMore__Group__035236 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__Group__1_in_rule__StatemachineOperationMore__Group__035239 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__Group__1__Impl_in_rule__StatemachineOperationMore__Group__135297 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__Group__2_in_rule__StatemachineOperationMore__Group__135300 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__StatemachineOperationMore__Group__1__Impl35328 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__Group__2__Impl_in_rule__StatemachineOperationMore__Group__235359 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__Group__3_in_rule__StatemachineOperationMore__Group__235362 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_197_in_rule__StatemachineOperationMore__Group__2__Impl35390 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__Group__3__Impl_in_rule__StatemachineOperationMore__Group__335421 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationMore__OperationAssignment_3_in_rule__StatemachineOperationMore__Group__3__Impl35448 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__0__Impl_in_rule__StatemachineStorageRetrieveMore__Group__035486 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__1_in_rule__StatemachineStorageRetrieveMore__Group__035489 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__1__Impl_in_rule__StatemachineStorageRetrieveMore__Group__135547 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__2_in_rule__StatemachineStorageRetrieveMore__Group__135550 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__StatemachineStorageRetrieveMore__Group__1__Impl35578 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__2__Impl_in_rule__StatemachineStorageRetrieveMore__Group__235609 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__3_in_rule__StatemachineStorageRetrieveMore__Group__235612 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_207_in_rule__StatemachineStorageRetrieveMore__Group__2__Impl35640 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__3__Impl_in_rule__StatemachineStorageRetrieveMore__Group__335671 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__4_in_rule__StatemachineStorageRetrieveMore__Group__335674 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_195_in_rule__StatemachineStorageRetrieveMore__Group__3__Impl35702 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__4__Impl_in_rule__StatemachineStorageRetrieveMore__Group__435733 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__5_in_rule__StatemachineStorageRetrieveMore__Group__435736 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__KeyAssignment_4_in_rule__StatemachineStorageRetrieveMore__Group__4__Impl35763 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__5__Impl_in_rule__StatemachineStorageRetrieveMore__Group__535793 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__6_in_rule__StatemachineStorageRetrieveMore__Group__535796 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__StatemachineStorageRetrieveMore__Group__5__Impl35824 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__Group__6__Impl_in_rule__StatemachineStorageRetrieveMore__Group__635855 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineStorageRetrieveMore__AttributeAssignment_6_in_rule__StatemachineStorageRetrieveMore__Group__6__Impl35882 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__0__Impl_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__035926 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__1_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__035929 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__1__Impl_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__135987 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000040000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__2_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__135990 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_34_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__1__Impl36018 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__2__Impl_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__236049 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__3_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__236052 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_210_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__2__Impl36080 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__3__Impl_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__336111 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__4_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__336114 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__DtoAssignment_3_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__3__Impl36141 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__4__Impl_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__436171 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__5_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__436174 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__4__Impl36202 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__5__Impl_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__536233 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSourceDtoAttributeMore__AttributeAssignment_5_in_rule__StatemachineActionFieldSourceDtoAttributeMore__Group__5__Impl36260 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldConcatenation__Group__0__Impl_in_rule__StatemachineActionFieldConcatenation__Group__036302 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldConcatenation__Group__1_in_rule__StatemachineActionFieldConcatenation__Group__036305 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldConcatenation__FirstAssignment_0_in_rule__StatemachineActionFieldConcatenation__Group__0__Impl36332 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldConcatenation__Group__1__Impl_in_rule__StatemachineActionFieldConcatenation__Group__136362 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldConcatenation__MoreAssignment_1_in_rule__StatemachineActionFieldConcatenation__Group__1__Impl36389 = new BitSet(new long[]{0x0000000400000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationParameterMore__Group__0__Impl_in_rule__StatemachineOperationParameterMore__Group__036424 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationParameterMore__Group__1_in_rule__StatemachineOperationParameterMore__Group__036427 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationParameterMore__Group__1__Impl_in_rule__StatemachineOperationParameterMore__Group__136485 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationParameterMore__Group__2_in_rule__StatemachineOperationParameterMore__Group__136488 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_212_in_rule__StatemachineOperationParameterMore__Group__1__Impl36516 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationParameterMore__Group__2__Impl_in_rule__StatemachineOperationParameterMore__Group__236547 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineOperationParameterMore__SourceAssignment_2_in_rule__StatemachineOperationParameterMore__Group__2__Impl36574 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__Group__0__Impl_in_rule__StatemachineActionFieldSet__Group__036610 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__Group__1_in_rule__StatemachineActionFieldSet__Group__036613 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_213_in_rule__StatemachineActionFieldSet__Group__0__Impl36641 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__Group__1__Impl_in_rule__StatemachineActionFieldSet__Group__136672 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__Group__2_in_rule__StatemachineActionFieldSet__Group__136675 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__SourceAssignment_1_in_rule__StatemachineActionFieldSet__Group__1__Impl36702 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__Group__2__Impl_in_rule__StatemachineActionFieldSet__Group__236732 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__Group__3_in_rule__StatemachineActionFieldSet__Group__236735 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionFieldSet__Group__2__Impl36763 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__Group__3__Impl_in_rule__StatemachineActionFieldSet__Group__336794 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldSet__AttributeAssignment_3_in_rule__StatemachineActionFieldSet__Group__3__Impl36821 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldClear__Group__0__Impl_in_rule__StatemachineActionFieldClear__Group__036859 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldClear__Group__1_in_rule__StatemachineActionFieldClear__Group__036862 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_214_in_rule__StatemachineActionFieldClear__Group__0__Impl36890 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldClear__Group__1__Impl_in_rule__StatemachineActionFieldClear__Group__136921 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldClear__AttributeAssignment_1_in_rule__StatemachineActionFieldClear__Group__1__Impl36948 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGet__Group__0__Impl_in_rule__StatemachineActionFieldGet__Group__036982 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGet__Group__1_in_rule__StatemachineActionFieldGet__Group__036985 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_211_in_rule__StatemachineActionFieldGet__Group__0__Impl37013 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGet__Group__1__Impl_in_rule__StatemachineActionFieldGet__Group__137044 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldGet__AttributeAssignment_1_in_rule__StatemachineActionFieldGet__Group__1__Impl37071 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldRemove__Group__0__Impl_in_rule__StatemachineActionFieldRemove__Group__037105 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldRemove__Group__1_in_rule__StatemachineActionFieldRemove__Group__037108 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_215_in_rule__StatemachineActionFieldRemove__Group__0__Impl37136 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldRemove__Group__1__Impl_in_rule__StatemachineActionFieldRemove__Group__137167 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionFieldRemove__AttributeAssignment_1_in_rule__StatemachineActionFieldRemove__Group__1__Impl37194 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionItemVisible__Group__0__Impl_in_rule__StatemachineActionItemVisible__Group__037228 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionItemVisible__Group__1_in_rule__StatemachineActionItemVisible__Group__037231 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_216_in_rule__StatemachineActionItemVisible__Group__0__Impl37259 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets017 {
+        public static final BitSet FOLLOW_rule__StatemachineActionItemVisible__Group__1__Impl_in_rule__StatemachineActionItemVisible__Group__137290 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionItemVisible__AttributeAssignment_1_in_rule__StatemachineActionItemVisible__Group__1__Impl37317 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionItemInvisible__Group__0__Impl_in_rule__StatemachineActionItemInvisible__Group__037351 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionItemInvisible__Group__1_in_rule__StatemachineActionItemInvisible__Group__037354 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_217_in_rule__StatemachineActionItemInvisible__Group__0__Impl37382 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionItemInvisible__Group__1__Impl_in_rule__StatemachineActionItemInvisible__Group__137413 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionItemInvisible__AttributeAssignment_1_in_rule__StatemachineActionItemInvisible__Group__1__Impl37440 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__Group__0__Impl_in_rule__StatemachineActionButtonCaption__Group__037474 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__Group__1_in_rule__StatemachineActionButtonCaption__Group__037477 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_201_in_rule__StatemachineActionButtonCaption__Group__0__Impl37505 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__Group__1__Impl_in_rule__StatemachineActionButtonCaption__Group__137536 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__Group__2_in_rule__StatemachineActionButtonCaption__Group__137539 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__CaptionAssignment_1_in_rule__StatemachineActionButtonCaption__Group__1__Impl37566 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__Group__2__Impl_in_rule__StatemachineActionButtonCaption__Group__237596 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__Group__3_in_rule__StatemachineActionButtonCaption__Group__237599 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionButtonCaption__Group__2__Impl37627 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__Group__3__Impl_in_rule__StatemachineActionButtonCaption__Group__337658 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonCaption__AttributeAssignment_3_in_rule__StatemachineActionButtonCaption__Group__3__Impl37685 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__Group__0__Impl_in_rule__StatemachineActionButtonImage__Group__037723 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__Group__1_in_rule__StatemachineActionButtonImage__Group__037726 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_218_in_rule__StatemachineActionButtonImage__Group__0__Impl37754 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__Group__1__Impl_in_rule__StatemachineActionButtonImage__Group__137785 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__Group__2_in_rule__StatemachineActionButtonImage__Group__137788 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__ImageAssignment_1_in_rule__StatemachineActionButtonImage__Group__1__Impl37815 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__Group__2__Impl_in_rule__StatemachineActionButtonImage__Group__237845 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__Group__3_in_rule__StatemachineActionButtonImage__Group__237848 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__StatemachineActionButtonImage__Group__2__Impl37876 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__Group__3__Impl_in_rule__StatemachineActionButtonImage__Group__337907 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionButtonImage__AttributeAssignment_3_in_rule__StatemachineActionButtonImage__Group__3__Impl37934 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__0__Impl_in_rule__StatemachineActionDTOFind__Group__037972 = new BitSet(new long[]{0xE0000008000000A0L,0x00000000000007FFL,0x0000000000008000L,0x00000000000E9004L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__1_in_rule__StatemachineActionDTOFind__Group__037975 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_219_in_rule__StatemachineActionDTOFind__Group__0__Impl38003 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__1__Impl_in_rule__StatemachineActionDTOFind__Group__138034 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000010000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__2_in_rule__StatemachineActionDTOFind__Group__138037 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__SearchAssignment_1_in_rule__StatemachineActionDTOFind__Group__1__Impl38064 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__2__Impl_in_rule__StatemachineActionDTOFind__Group__238094 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__3_in_rule__StatemachineActionDTOFind__Group__238097 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_220_in_rule__StatemachineActionDTOFind__Group__2__Impl38125 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__3__Impl_in_rule__StatemachineActionDTOFind__Group__338156 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__4_in_rule__StatemachineActionDTOFind__Group__338159 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__DtoAssignment_3_in_rule__StatemachineActionDTOFind__Group__3__Impl38186 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__4__Impl_in_rule__StatemachineActionDTOFind__Group__438216 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__5_in_rule__StatemachineActionDTOFind__Group__438219 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__StatemachineActionDTOFind__Group__4__Impl38247 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__Group__5__Impl_in_rule__StatemachineActionDTOFind__Group__538278 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionDTOFind__AttributeAssignment_5_in_rule__StatemachineActionDTOFind__Group__5__Impl38305 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionScheduler__Group__0__Impl_in_rule__StatemachineActionScheduler__Group__038347 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineActionScheduler__Group__1_in_rule__StatemachineActionScheduler__Group__038350 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_221_in_rule__StatemachineActionScheduler__Group__0__Impl38378 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionScheduler__Group__1__Impl_in_rule__StatemachineActionScheduler__Group__138409 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineActionScheduler__SchedulerAssignment_1_in_rule__StatemachineActionScheduler__Group__1__Impl38436 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__0__Impl_in_rule__StatemachineControlButton__Group__038470 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__1_in_rule__StatemachineControlButton__Group__038473 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_222_in_rule__StatemachineControlButton__Group__0__Impl38501 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__1__Impl_in_rule__StatemachineControlButton__Group__138532 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__2_in_rule__StatemachineControlButton__Group__138535 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__NameAssignment_1_in_rule__StatemachineControlButton__Group__1__Impl38562 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__2__Impl_in_rule__StatemachineControlButton__Group__238592 = new BitSet(new long[]{0x1C00000000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__3_in_rule__StatemachineControlButton__Group__238595 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_143_in_rule__StatemachineControlButton__Group__2__Impl38623 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__3__Impl_in_rule__StatemachineControlButton__Group__338654 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__4_in_rule__StatemachineControlButton__Group__338657 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__EventTypeAssignment_3_in_rule__StatemachineControlButton__Group__3__Impl38684 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__4__Impl_in_rule__StatemachineControlButton__Group__438714 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000008000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__5_in_rule__StatemachineControlButton__Group__438717 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineControlButton__Group__4__Impl38745 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__5__Impl_in_rule__StatemachineControlButton__Group__538776 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000008000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__6_in_rule__StatemachineControlButton__Group__538779 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__ButtonsAssignment_5_in_rule__StatemachineControlButton__Group__5__Impl38806 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000008000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButton__Group__6__Impl_in_rule__StatemachineControlButton__Group__638837 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineControlButton__Group__6__Impl38865 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__0__Impl_in_rule__StatemachineControlField__Group__038910 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__1_in_rule__StatemachineControlField__Group__038913 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_223_in_rule__StatemachineControlField__Group__0__Impl38941 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__1__Impl_in_rule__StatemachineControlField__Group__138972 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__2_in_rule__StatemachineControlField__Group__138975 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__NameAssignment_1_in_rule__StatemachineControlField__Group__1__Impl39002 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__2__Impl_in_rule__StatemachineControlField__Group__239032 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000060000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__3_in_rule__StatemachineControlField__Group__239035 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineControlField__Group__2__Impl39063 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__3__Impl_in_rule__StatemachineControlField__Group__339094 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__4_in_rule__StatemachineControlField__Group__339097 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__UnorderedGroup_3_in_rule__StatemachineControlField__Group__3__Impl39124 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlField__Group__4__Impl_in_rule__StatemachineControlField__Group__439154 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineControlField__Group__4__Impl39182 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__0__Impl_in_rule__StatemachineControlDTO__Group__039223 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__1_in_rule__StatemachineControlDTO__Group__039226 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_224_in_rule__StatemachineControlDTO__Group__0__Impl39254 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__1__Impl_in_rule__StatemachineControlDTO__Group__139285 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__2_in_rule__StatemachineControlDTO__Group__139288 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__NameAssignment_1_in_rule__StatemachineControlDTO__Group__1__Impl39315 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__2__Impl_in_rule__StatemachineControlDTO__Group__239345 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000000000040000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__3_in_rule__StatemachineControlDTO__Group__239348 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineControlDTO__Group__2__Impl39376 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__3__Impl_in_rule__StatemachineControlDTO__Group__339407 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000000000040000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__4_in_rule__StatemachineControlDTO__Group__339410 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__DtosAssignment_3_in_rule__StatemachineControlDTO__Group__3__Impl39437 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000040000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTO__Group__4__Impl_in_rule__StatemachineControlDTO__Group__439468 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineControlDTO__Group__4__Impl39496 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__0__Impl_in_rule__StatemachineControlScheduler__Group__039537 = new BitSet(new long[]{0x0000000000000010L});
+    }
+
+    protected static class FollowSets018 {
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__1_in_rule__StatemachineControlScheduler__Group__039540 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_225_in_rule__StatemachineControlScheduler__Group__0__Impl39568 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__1__Impl_in_rule__StatemachineControlScheduler__Group__139599 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__2_in_rule__StatemachineControlScheduler__Group__139602 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__NameAssignment_1_in_rule__StatemachineControlScheduler__Group__1__Impl39629 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__2__Impl_in_rule__StatemachineControlScheduler__Group__239659 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000000200000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__3_in_rule__StatemachineControlScheduler__Group__239662 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineControlScheduler__Group__2__Impl39690 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__3__Impl_in_rule__StatemachineControlScheduler__Group__339721 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000000200000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__4_in_rule__StatemachineControlScheduler__Group__339724 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__SchedulersAssignment_3_in_rule__StatemachineControlScheduler__Group__3__Impl39751 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000200000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlScheduler__Group__4__Impl_in_rule__StatemachineControlScheduler__Group__439782 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineControlScheduler__Group__4__Impl39810 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceLineDisplay__Group__0__Impl_in_rule__StatemachinePeripheralDeviceLineDisplay__Group__039851 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceLineDisplay__Group__1_in_rule__StatemachinePeripheralDeviceLineDisplay__Group__039854 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_226_in_rule__StatemachinePeripheralDeviceLineDisplay__Group__0__Impl39882 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceLineDisplay__Group__1__Impl_in_rule__StatemachinePeripheralDeviceLineDisplay__Group__139913 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceLineDisplay__NameAssignment_1_in_rule__StatemachinePeripheralDeviceLineDisplay__Group__1__Impl39940 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePOSPrinter__Group__0__Impl_in_rule__StatemachinePeripheralDevicePOSPrinter__Group__039974 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePOSPrinter__Group__1_in_rule__StatemachinePeripheralDevicePOSPrinter__Group__039977 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_227_in_rule__StatemachinePeripheralDevicePOSPrinter__Group__0__Impl40005 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePOSPrinter__Group__1__Impl_in_rule__StatemachinePeripheralDevicePOSPrinter__Group__140036 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePOSPrinter__NameAssignment_1_in_rule__StatemachinePeripheralDevicePOSPrinter__Group__1__Impl40063 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceCashDrawer__Group__0__Impl_in_rule__StatemachinePeripheralDeviceCashDrawer__Group__040097 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceCashDrawer__Group__1_in_rule__StatemachinePeripheralDeviceCashDrawer__Group__040100 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_228_in_rule__StatemachinePeripheralDeviceCashDrawer__Group__0__Impl40128 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceCashDrawer__Group__1__Impl_in_rule__StatemachinePeripheralDeviceCashDrawer__Group__140159 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDeviceCashDrawer__NameAssignment_1_in_rule__StatemachinePeripheralDeviceCashDrawer__Group__1__Impl40186 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePT__Group__0__Impl_in_rule__StatemachinePeripheralDevicePT__Group__040220 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePT__Group__1_in_rule__StatemachinePeripheralDevicePT__Group__040223 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_229_in_rule__StatemachinePeripheralDevicePT__Group__0__Impl40251 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePT__Group__1__Impl_in_rule__StatemachinePeripheralDevicePT__Group__140282 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachinePeripheralDevicePT__NameAssignment_1_in_rule__StatemachinePeripheralDevicePT__Group__1__Impl40309 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__0__Impl_in_rule__StatemachineControlPeripheral__Group__040343 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__1_in_rule__StatemachineControlPeripheral__Group__040346 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_230_in_rule__StatemachineControlPeripheral__Group__0__Impl40374 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__1__Impl_in_rule__StatemachineControlPeripheral__Group__140405 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__2_in_rule__StatemachineControlPeripheral__Group__140408 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__NameAssignment_1_in_rule__StatemachineControlPeripheral__Group__1__Impl40435 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__2__Impl_in_rule__StatemachineControlPeripheral__Group__240465 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000003C00000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__3_in_rule__StatemachineControlPeripheral__Group__240468 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_134_in_rule__StatemachineControlPeripheral__Group__2__Impl40496 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__3__Impl_in_rule__StatemachineControlPeripheral__Group__340527 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000003C00000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__4_in_rule__StatemachineControlPeripheral__Group__340530 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__LineDisplaysAssignment_3_in_rule__StatemachineControlPeripheral__Group__3__Impl40557 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000400000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__4__Impl_in_rule__StatemachineControlPeripheral__Group__440588 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000003C00000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__5_in_rule__StatemachineControlPeripheral__Group__440591 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__PosPrintersAssignment_4_in_rule__StatemachineControlPeripheral__Group__4__Impl40618 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__5__Impl_in_rule__StatemachineControlPeripheral__Group__540649 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000003C00000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__6_in_rule__StatemachineControlPeripheral__Group__540652 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__CashDrawersAssignment_5_in_rule__StatemachineControlPeripheral__Group__5__Impl40679 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000001000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__6__Impl_in_rule__StatemachineControlPeripheral__Group__640710 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L,0x0000003C00000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__7_in_rule__StatemachineControlPeripheral__Group__640713 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__PaymentTerminalsAssignment_6_in_rule__StatemachineControlPeripheral__Group__6__Impl40740 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000002000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlPeripheral__Group__7__Impl_in_rule__StatemachineControlPeripheral__Group__740771 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_135_in_rule__StatemachineControlPeripheral__Group__7__Impl40799 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group__0__Impl_in_rule__StatemachineControlButtonAttribute__Group__040846 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group__1_in_rule__StatemachineControlButtonAttribute__Group__040849 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_231_in_rule__StatemachineControlButtonAttribute__Group__0__Impl40877 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group__1__Impl_in_rule__StatemachineControlButtonAttribute__Group__140908 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000800008000L,0x0000010004000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group__2_in_rule__StatemachineControlButtonAttribute__Group__140911 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__NameAssignment_1_in_rule__StatemachineControlButtonAttribute__Group__1__Impl40938 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group__2__Impl_in_rule__StatemachineControlButtonAttribute__Group__240968 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000800008000L,0x0000010004000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group__3_in_rule__StatemachineControlButtonAttribute__Group__240971 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group_2__0_in_rule__StatemachineControlButtonAttribute__Group__2__Impl40998 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group__3__Impl_in_rule__StatemachineControlButtonAttribute__Group__341029 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__EventAssignment_3_in_rule__StatemachineControlButtonAttribute__Group__3__Impl41056 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group_2__0__Impl_in_rule__StatemachineControlButtonAttribute__Group_2__041094 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group_2__1_in_rule__StatemachineControlButtonAttribute__Group_2__041097 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__HasImageAssignment_2_0_in_rule__StatemachineControlButtonAttribute__Group_2__0__Impl41124 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__Group_2__1__Impl_in_rule__StatemachineControlButtonAttribute__Group_2__141154 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttribute__ImageAssignment_2_1_in_rule__StatemachineControlButtonAttribute__Group_2__1__Impl41181 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventKeyboard__Group__0__Impl_in_rule__StatemachineControlButtonAttributeEventKeyboard__Group__041215 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000010000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventKeyboard__Group__1_in_rule__StatemachineControlButtonAttributeEventKeyboard__Group__041218 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventKeyboard__Group__1__Impl_in_rule__StatemachineControlButtonAttributeEventKeyboard__Group__141276 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventKeyboard__Group__2_in_rule__StatemachineControlButtonAttributeEventKeyboard__Group__141279 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_232_in_rule__StatemachineControlButtonAttributeEventKeyboard__Group__1__Impl41307 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventKeyboard__Group__2__Impl_in_rule__StatemachineControlButtonAttributeEventKeyboard__Group__241338 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventKeyboard__KeystrokeAssignment_2_in_rule__StatemachineControlButtonAttributeEventKeyboard__Group__2__Impl41365 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventIdentity__Group__0__Impl_in_rule__StatemachineControlButtonAttributeEventIdentity__Group__041401 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventIdentity__Group__1_in_rule__StatemachineControlButtonAttributeEventIdentity__Group__041404 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventIdentity__Group__1__Impl_in_rule__StatemachineControlButtonAttributeEventIdentity__Group__141462 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventIdentity__Group__2_in_rule__StatemachineControlButtonAttributeEventIdentity__Group__141465 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_163_in_rule__StatemachineControlButtonAttributeEventIdentity__Group__1__Impl41493 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventIdentity__Group__2__Impl_in_rule__StatemachineControlButtonAttributeEventIdentity__Group__241524 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventIdentity__IdentityAssignment_2_in_rule__StatemachineControlButtonAttributeEventIdentity__Group__2__Impl41551 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventEvent__Group__0__Impl_in_rule__StatemachineControlButtonAttributeEventEvent__Group__041587 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000800008000L,0x0000010004000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventEvent__Group__1_in_rule__StatemachineControlButtonAttributeEventEvent__Group__041590 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventEvent__Group__1__Impl_in_rule__StatemachineControlButtonAttributeEventEvent__Group__141648 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventEvent__Group__2_in_rule__StatemachineControlButtonAttributeEventEvent__Group__141651 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_143_in_rule__StatemachineControlButtonAttributeEventEvent__Group__1__Impl41679 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventEvent__Group__2__Impl_in_rule__StatemachineControlButtonAttributeEventEvent__Group__241710 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlButtonAttributeEventEvent__EventAssignment_2_in_rule__StatemachineControlButtonAttributeEventEvent__Group__2__Impl41737 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__Group__0__Impl_in_rule__StatemachineControlFieldAttribute__Group__041773 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__Group__1_in_rule__StatemachineControlFieldAttribute__Group__041776 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_233_in_rule__StatemachineControlFieldAttribute__Group__0__Impl41804 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__Group__1__Impl_in_rule__StatemachineControlFieldAttribute__Group__141835 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__Group__2_in_rule__StatemachineControlFieldAttribute__Group__141838 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__NameAssignment_1_in_rule__StatemachineControlFieldAttribute__Group__1__Impl41865 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__Group__2__Impl_in_rule__StatemachineControlFieldAttribute__Group__241895 = new BitSet(new long[]{0x03F8000000000000L});
+    }
+
+    protected static class FollowSets019 {
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__Group__3_in_rule__StatemachineControlFieldAttribute__Group__241898 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_203_in_rule__StatemachineControlFieldAttribute__Group__2__Impl41926 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__Group__3__Impl_in_rule__StatemachineControlFieldAttribute__Group__341957 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldAttribute__AttributeTypeAssignment_3_in_rule__StatemachineControlFieldAttribute__Group__3__Impl41984 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldLayout__Group__0__Impl_in_rule__StatemachineControlFieldLayout__Group__042022 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldLayout__Group__1_in_rule__StatemachineControlFieldLayout__Group__042025 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_234_in_rule__StatemachineControlFieldLayout__Group__0__Impl42053 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldLayout__Group__1__Impl_in_rule__StatemachineControlFieldLayout__Group__142084 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlFieldLayout__NameAssignment_1_in_rule__StatemachineControlFieldLayout__Group__1__Impl42111 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__0__Impl_in_rule__StatemachineControlDTOAttribute__Group__042145 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__1_in_rule__StatemachineControlDTOAttribute__Group__042148 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_210_in_rule__StatemachineControlDTOAttribute__Group__0__Impl42176 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__1__Impl_in_rule__StatemachineControlDTOAttribute__Group__142207 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__2_in_rule__StatemachineControlDTOAttribute__Group__142210 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__NameAssignment_1_in_rule__StatemachineControlDTOAttribute__Group__1__Impl42237 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__2__Impl_in_rule__StatemachineControlDTOAttribute__Group__242267 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__3_in_rule__StatemachineControlDTOAttribute__Group__242270 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_203_in_rule__StatemachineControlDTOAttribute__Group__2__Impl42298 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__3__Impl_in_rule__StatemachineControlDTOAttribute__Group__342329 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__4_in_rule__StatemachineControlDTOAttribute__Group__342332 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__AttributeTypeAssignment_3_in_rule__StatemachineControlDTOAttribute__Group__3__Impl42359 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group__4__Impl_in_rule__StatemachineControlDTOAttribute__Group__442389 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group_4__0_in_rule__StatemachineControlDTOAttribute__Group__4__Impl42416 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group_4__0__Impl_in_rule__StatemachineControlDTOAttribute__Group_4__042457 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group_4__1_in_rule__StatemachineControlDTOAttribute__Group_4__042460 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__HasEventAssignment_4_0_in_rule__StatemachineControlDTOAttribute__Group_4__0__Impl42487 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__Group_4__1__Impl_in_rule__StatemachineControlDTOAttribute__Group_4__142517 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlDTOAttribute__EventAssignment_4_1_in_rule__StatemachineControlDTOAttribute__Group_4__1__Impl42544 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__0__Impl_in_rule__StatemachineControlSchedulerAttribute__Group__042578 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__1_in_rule__StatemachineControlSchedulerAttribute__Group__042581 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_225_in_rule__StatemachineControlSchedulerAttribute__Group__0__Impl42609 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__1__Impl_in_rule__StatemachineControlSchedulerAttribute__Group__142640 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__2_in_rule__StatemachineControlSchedulerAttribute__Group__142643 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__NameAssignment_1_in_rule__StatemachineControlSchedulerAttribute__Group__1__Impl42670 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__2__Impl_in_rule__StatemachineControlSchedulerAttribute__Group__242700 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__3_in_rule__StatemachineControlSchedulerAttribute__Group__242703 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_235_in_rule__StatemachineControlSchedulerAttribute__Group__2__Impl42731 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__3__Impl_in_rule__StatemachineControlSchedulerAttribute__Group__342762 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000100000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__4_in_rule__StatemachineControlSchedulerAttribute__Group__342765 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__DelayAssignment_3_in_rule__StatemachineControlSchedulerAttribute__Group__3__Impl42792 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__4__Impl_in_rule__StatemachineControlSchedulerAttribute__Group__442822 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__5_in_rule__StatemachineControlSchedulerAttribute__Group__442825 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_236_in_rule__StatemachineControlSchedulerAttribute__Group__4__Impl42853 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__Group__5__Impl_in_rule__StatemachineControlSchedulerAttribute__Group__542884 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineControlSchedulerAttribute__EventAssignment_5_in_rule__StatemachineControlSchedulerAttribute__Group__5__Impl42911 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineImport__Group__0__Impl_in_rule__StatemachineImport__Group__042953 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__StatemachineImport__Group__1_in_rule__StatemachineImport__Group__042956 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_47_in_rule__StatemachineImport__Group__0__Impl42984 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineImport__Group__1__Impl_in_rule__StatemachineImport__Group__143015 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineImport__ImportedNamespaceAssignment_1_in_rule__StatemachineImport__Group__1__Impl43042 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineQualifiedNameWithWildCard__Group__0__Impl_in_rule__StatemachineQualifiedNameWithWildCard__Group__043076 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineQualifiedNameWithWildCard__Group__1_in_rule__StatemachineQualifiedNameWithWildCard__Group__043079 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleQualifiedName_in_rule__StatemachineQualifiedNameWithWildCard__Group__0__Impl43106 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineQualifiedNameWithWildCard__Group__1__Impl_in_rule__StatemachineQualifiedNameWithWildCard__Group__143135 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineQualifiedNameWithWildCard__Group_1__0_in_rule__StatemachineQualifiedNameWithWildCard__Group__1__Impl43162 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineQualifiedNameWithWildCard__Group_1__0__Impl_in_rule__StatemachineQualifiedNameWithWildCard__Group_1__043197 = new BitSet(new long[]{0x0000001000000000L});
+        public static final BitSet FOLLOW_rule__StatemachineQualifiedNameWithWildCard__Group_1__1_in_rule__StatemachineQualifiedNameWithWildCard__Group_1__043200 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__StatemachineQualifiedNameWithWildCard__Group_1__0__Impl43228 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__StatemachineQualifiedNameWithWildCard__Group_1__1__Impl_in_rule__StatemachineQualifiedNameWithWildCard__Group_1__143259 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_36_in_rule__StatemachineQualifiedNameWithWildCard__Group_1__1__Impl43287 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__QualifiedName__Group__0__Impl_in_rule__QualifiedName__Group__043322 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__QualifiedName__Group__1_in_rule__QualifiedName__Group__043325 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleValidID_in_rule__QualifiedName__Group__0__Impl43352 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__QualifiedName__Group__1__Impl_in_rule__QualifiedName__Group__143381 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__QualifiedName__Group_1__0_in_rule__QualifiedName__Group__1__Impl43408 = new BitSet(new long[]{0x0000080000000002L});
+        public static final BitSet FOLLOW_rule__QualifiedName__Group_1__0__Impl_in_rule__QualifiedName__Group_1__043443 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__QualifiedName__Group_1__1_in_rule__QualifiedName__Group_1__043446 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__QualifiedName__Group_1__0__Impl43475 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__QualifiedName__Group_1__1__Impl_in_rule__QualifiedName__Group_1__143507 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleValidID_in_rule__QualifiedName__Group_1__1__Impl43534 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__SignedNumber__Group__0__Impl_in_rule__SignedNumber__Group__043567 = new BitSet(new long[]{0x0000000800000080L});
+        public static final BitSet FOLLOW_rule__SignedNumber__Group__1_in_rule__SignedNumber__Group__043570 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_35_in_rule__SignedNumber__Group__0__Impl43599 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__SignedNumber__Group__1__Impl_in_rule__SignedNumber__Group__143632 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleUnsignedNumber_in_rule__SignedNumber__Group__1__Impl43659 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__UnsignedNumber__Group__0__Impl_in_rule__UnsignedNumber__Group__043692 = new BitSet(new long[]{0x0000080000000000L});
+        public static final BitSet FOLLOW_rule__UnsignedNumber__Group__1_in_rule__UnsignedNumber__Group__043695 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_INT_in_rule__UnsignedNumber__Group__0__Impl43722 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__UnsignedNumber__Group__1__Impl_in_rule__UnsignedNumber__Group__143751 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__UnsignedNumber__Group_1__0_in_rule__UnsignedNumber__Group__1__Impl43778 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__UnsignedNumber__Group_1__0__Impl_in_rule__UnsignedNumber__Group_1__043813 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_rule__UnsignedNumber__Group_1__1_in_rule__UnsignedNumber__Group_1__043816 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_43_in_rule__UnsignedNumber__Group_1__0__Impl43844 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__UnsignedNumber__Group_1__1__Impl_in_rule__UnsignedNumber__Group_1__143875 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_RULE_INT_in_rule__UnsignedNumber__Group_1__1__Impl43902 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group__0__Impl_in_rule__XAnnotation__Group__043935 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group__1_in_rule__XAnnotation__Group__043938 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group__1__Impl_in_rule__XAnnotation__Group__143996 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group__2_in_rule__XAnnotation__Group__143999 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_147_in_rule__XAnnotation__Group__1__Impl44027 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group__2__Impl_in_rule__XAnnotation__Group__244058 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group__3_in_rule__XAnnotation__Group__244061 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__AnnotationTypeAssignment_2_in_rule__XAnnotation__Group__2__Impl44088 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group__3__Impl_in_rule__XAnnotation__Group__344118 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3__0_in_rule__XAnnotation__Group__3__Impl44145 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3__0__Impl_in_rule__XAnnotation__Group_3__044184 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C000000000C0L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3__1_in_rule__XAnnotation__Group_3__044187 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_198_in_rule__XAnnotation__Group_3__0__Impl44216 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3__1__Impl_in_rule__XAnnotation__Group_3__144248 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C000000000C0L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3__2_in_rule__XAnnotation__Group_3__144251 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets020 {
+        public static final BitSet FOLLOW_rule__XAnnotation__Alternatives_3_1_in_rule__XAnnotation__Group_3__1__Impl44278 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3__2__Impl_in_rule__XAnnotation__Group_3__244309 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_199_in_rule__XAnnotation__Group_3__2__Impl44337 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3_1_0__0__Impl_in_rule__XAnnotation__Group_3_1_0__044374 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3_1_0__1_in_rule__XAnnotation__Group_3_1_0__044377 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0_in_rule__XAnnotation__Group_3_1_0__0__Impl44404 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3_1_0__1__Impl_in_rule__XAnnotation__Group_3_1_0__144434 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3_1_0_1__0_in_rule__XAnnotation__Group_3_1_0__1__Impl44461 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3_1_0_1__0__Impl_in_rule__XAnnotation__Group_3_1_0_1__044496 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3_1_0_1__1_in_rule__XAnnotation__Group_3_1_0_1__044499 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_212_in_rule__XAnnotation__Group_3_1_0_1__0__Impl44527 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__Group_3_1_0_1__1__Impl_in_rule__XAnnotation__Group_3_1_0_1__144558 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1_in_rule__XAnnotation__Group_3_1_0_1__1__Impl44585 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group__0__Impl_in_rule__XAnnotationElementValuePair__Group__044619 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group__1_in_rule__XAnnotationElementValuePair__Group__044622 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group_0__0_in_rule__XAnnotationElementValuePair__Group__0__Impl44649 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group__1__Impl_in_rule__XAnnotationElementValuePair__Group__144679 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__ValueAssignment_1_in_rule__XAnnotationElementValuePair__Group__1__Impl44706 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group_0__0__Impl_in_rule__XAnnotationElementValuePair__Group_0__044740 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group_0_0__0_in_rule__XAnnotationElementValuePair__Group_0__0__Impl44767 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group_0_0__0__Impl_in_rule__XAnnotationElementValuePair__Group_0_0__044799 = new BitSet(new long[]{0x0000000000002000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group_0_0__1_in_rule__XAnnotationElementValuePair__Group_0_0__044802 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__ElementAssignment_0_0_0_in_rule__XAnnotationElementValuePair__Group_0_0__0__Impl44829 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValuePair__Group_0_0__1__Impl_in_rule__XAnnotationElementValuePair__Group_0_0__144859 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_13_in_rule__XAnnotationElementValuePair__Group_0_0__1__Impl44887 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0__044922 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28E00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__1_in_rule__XAnnotationElementValueOrCommaList__Group_0__044925 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_0__0_in_rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl44952 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0__144982 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28E00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__2_in_rule__XAnnotationElementValueOrCommaList__Group_0__144985 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_1__0_in_rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl45012 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0__245043 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_237_in_rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl45071 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0_0__045108 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0_in_rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl45135 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__045167 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000400000000000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1_in_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__045170 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__145228 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2_in_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__145231 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_238_in_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl45259 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__245290 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_239_in_rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl45318 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0_1__045355 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_1__1_in_rule__XAnnotationElementValueOrCommaList__Group_0_1__045358 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0_in_rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl45385 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0_1__145415 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0_in_rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl45442 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__045477 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1_in_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__045480 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_212_in_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl45508 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__145539 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1_in_rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl45566 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_1__045600 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__1_in_rule__XAnnotationElementValueOrCommaList__Group_1__045603 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAnnotationOrExpression_in_rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl45630 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_1__145659 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1__0_in_rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl45686 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_1_1__045721 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1__1_in_rule__XAnnotationElementValueOrCommaList__Group_1_1__045724 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_1_1__145782 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0_in_rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl45811 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0_in_rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl45823 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__045860 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1_in_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__045863 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_212_in_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl45891 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl_in_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__145922 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1_in_rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl45949 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0__0__Impl_in_rule__XAnnotationElementValue__Group_0__045983 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28E00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0__1_in_rule__XAnnotationElementValue__Group_0__045986 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_0__0_in_rule__XAnnotationElementValue__Group_0__0__Impl46013 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0__1__Impl_in_rule__XAnnotationElementValue__Group_0__146043 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28E00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0__2_in_rule__XAnnotationElementValue__Group_0__146046 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_1__0_in_rule__XAnnotationElementValue__Group_0__1__Impl46073 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0__2__Impl_in_rule__XAnnotationElementValue__Group_0__246104 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_237_in_rule__XAnnotationElementValue__Group_0__2__Impl46132 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_0__0__Impl_in_rule__XAnnotationElementValue__Group_0_0__046169 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_0_0__0_in_rule__XAnnotationElementValue__Group_0_0__0__Impl46196 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_0_0__0__Impl_in_rule__XAnnotationElementValue__Group_0_0_0__046228 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000400000000000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_0_0__1_in_rule__XAnnotationElementValue__Group_0_0_0__046231 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_0_0__1__Impl_in_rule__XAnnotationElementValue__Group_0_0_0__146289 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_0_0__2_in_rule__XAnnotationElementValue__Group_0_0_0__146292 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_238_in_rule__XAnnotationElementValue__Group_0_0_0__1__Impl46320 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_0_0__2__Impl_in_rule__XAnnotationElementValue__Group_0_0_0__246351 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_239_in_rule__XAnnotationElementValue__Group_0_0_0__2__Impl46379 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_1__0__Impl_in_rule__XAnnotationElementValue__Group_0_1__046416 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_1__1_in_rule__XAnnotationElementValue__Group_0_1__046419 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__ElementsAssignment_0_1_0_in_rule__XAnnotationElementValue__Group_0_1__0__Impl46446 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_1__1__Impl_in_rule__XAnnotationElementValue__Group_0_1__146476 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_1_1__0_in_rule__XAnnotationElementValue__Group_0_1__1__Impl46503 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_1_1__0__Impl_in_rule__XAnnotationElementValue__Group_0_1_1__046538 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_1_1__1_in_rule__XAnnotationElementValue__Group_0_1_1__046541 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_212_in_rule__XAnnotationElementValue__Group_0_1_1__0__Impl46569 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__Group_0_1_1__1__Impl_in_rule__XAnnotationElementValue__Group_0_1_1__146600 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1_in_rule__XAnnotationElementValue__Group_0_1_1__1__Impl46627 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_0__0__Impl_in_rule__XAssignment__Group_0__046661 = new BitSet(new long[]{0x0001E00000000010L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_0__1_in_rule__XAssignment__Group_0__046664 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_0__1__Impl_in_rule__XAssignment__Group_0__146722 = new BitSet(new long[]{0x0000000000002000L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_0__2_in_rule__XAssignment__Group_0__146725 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__FeatureAssignment_0_1_in_rule__XAssignment__Group_0__1__Impl46752 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_0__2__Impl_in_rule__XAssignment__Group_0__246782 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+    }
+
+    protected static class FollowSets021 {
+        public static final BitSet FOLLOW_rule__XAssignment__Group_0__3_in_rule__XAssignment__Group_0__246785 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleOpSingleAssign_in_rule__XAssignment__Group_0__2__Impl46812 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_0__3__Impl_in_rule__XAssignment__Group_0__346841 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__ValueAssignment_0_3_in_rule__XAssignment__Group_0__3__Impl46868 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1__0__Impl_in_rule__XAssignment__Group_1__046906 = new BitSet(new long[]{0x000000000C1F0000L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1__1_in_rule__XAssignment__Group_1__046909 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXOrExpression_in_rule__XAssignment__Group_1__0__Impl46936 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1__1__Impl_in_rule__XAssignment__Group_1__146965 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1__0_in_rule__XAssignment__Group_1__1__Impl46992 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1__0__Impl_in_rule__XAssignment__Group_1_1__047027 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1__1_in_rule__XAssignment__Group_1_1__047030 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1_0__0_in_rule__XAssignment__Group_1_1__0__Impl47057 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1__1__Impl_in_rule__XAssignment__Group_1_1__147087 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__RightOperandAssignment_1_1_1_in_rule__XAssignment__Group_1_1__1__Impl47114 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1_0__0__Impl_in_rule__XAssignment__Group_1_1_0__047148 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1_0_0__0_in_rule__XAssignment__Group_1_1_0__0__Impl47175 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1_0_0__0__Impl_in_rule__XAssignment__Group_1_1_0_0__047207 = new BitSet(new long[]{0x000000000C1F0000L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1_0_0__1_in_rule__XAssignment__Group_1_1_0_0__047210 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__Group_1_1_0_0__1__Impl_in_rule__XAssignment__Group_1_1_0_0__147268 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAssignment__FeatureAssignment_1_1_0_0_1_in_rule__XAssignment__Group_1_1_0_0__1__Impl47295 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_5__0__Impl_in_rule__OpMultiAssign__Group_5__047329 = new BitSet(new long[]{0x0000000008000000L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_5__1_in_rule__OpMultiAssign__Group_5__047332 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_27_in_rule__OpMultiAssign__Group_5__0__Impl47360 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_5__1__Impl_in_rule__OpMultiAssign__Group_5__147391 = new BitSet(new long[]{0x0000000000002000L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_5__2_in_rule__OpMultiAssign__Group_5__147394 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_27_in_rule__OpMultiAssign__Group_5__1__Impl47422 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_5__2__Impl_in_rule__OpMultiAssign__Group_5__247453 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_13_in_rule__OpMultiAssign__Group_5__2__Impl47481 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_6__0__Impl_in_rule__OpMultiAssign__Group_6__047518 = new BitSet(new long[]{0x0000000006000000L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_6__1_in_rule__OpMultiAssign__Group_6__047521 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_26_in_rule__OpMultiAssign__Group_6__0__Impl47549 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_6__1__Impl_in_rule__OpMultiAssign__Group_6__147580 = new BitSet(new long[]{0x0000000006000000L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_6__2_in_rule__OpMultiAssign__Group_6__147583 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_26_in_rule__OpMultiAssign__Group_6__1__Impl47612 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpMultiAssign__Group_6__2__Impl_in_rule__OpMultiAssign__Group_6__247645 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_25_in_rule__OpMultiAssign__Group_6__2__Impl47673 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group__0__Impl_in_rule__XOrExpression__Group__047710 = new BitSet(new long[]{0x0000000000004000L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group__1_in_rule__XOrExpression__Group__047713 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAndExpression_in_rule__XOrExpression__Group__0__Impl47740 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group__1__Impl_in_rule__XOrExpression__Group__147769 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1__0_in_rule__XOrExpression__Group__1__Impl47796 = new BitSet(new long[]{0x0000000000004002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1__0__Impl_in_rule__XOrExpression__Group_1__047831 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1__1_in_rule__XOrExpression__Group_1__047834 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1_0__0_in_rule__XOrExpression__Group_1__0__Impl47861 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1__1__Impl_in_rule__XOrExpression__Group_1__147891 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__RightOperandAssignment_1_1_in_rule__XOrExpression__Group_1__1__Impl47918 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1_0__0__Impl_in_rule__XOrExpression__Group_1_0__047952 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1_0_0__0_in_rule__XOrExpression__Group_1_0__0__Impl47979 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1_0_0__0__Impl_in_rule__XOrExpression__Group_1_0_0__048011 = new BitSet(new long[]{0x0000000000004000L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1_0_0__1_in_rule__XOrExpression__Group_1_0_0__048014 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__Group_1_0_0__1__Impl_in_rule__XOrExpression__Group_1_0_0__148072 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOrExpression__FeatureAssignment_1_0_0_1_in_rule__XOrExpression__Group_1_0_0__1__Impl48099 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group__0__Impl_in_rule__XAndExpression__Group__048133 = new BitSet(new long[]{0x0000000000008000L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group__1_in_rule__XAndExpression__Group__048136 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXEqualityExpression_in_rule__XAndExpression__Group__0__Impl48163 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group__1__Impl_in_rule__XAndExpression__Group__148192 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1__0_in_rule__XAndExpression__Group__1__Impl48219 = new BitSet(new long[]{0x0000000000008002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1__0__Impl_in_rule__XAndExpression__Group_1__048254 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1__1_in_rule__XAndExpression__Group_1__048257 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1_0__0_in_rule__XAndExpression__Group_1__0__Impl48284 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1__1__Impl_in_rule__XAndExpression__Group_1__148314 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__RightOperandAssignment_1_1_in_rule__XAndExpression__Group_1__1__Impl48341 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1_0__0__Impl_in_rule__XAndExpression__Group_1_0__048375 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1_0_0__0_in_rule__XAndExpression__Group_1_0__0__Impl48402 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1_0_0__0__Impl_in_rule__XAndExpression__Group_1_0_0__048434 = new BitSet(new long[]{0x0000000000008000L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1_0_0__1_in_rule__XAndExpression__Group_1_0_0__048437 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__Group_1_0_0__1__Impl_in_rule__XAndExpression__Group_1_0_0__148495 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAndExpression__FeatureAssignment_1_0_0_1_in_rule__XAndExpression__Group_1_0_0__1__Impl48522 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group__0__Impl_in_rule__XEqualityExpression__Group__048556 = new BitSet(new long[]{0x0000000001E00000L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group__1_in_rule__XEqualityExpression__Group__048559 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXRelationalExpression_in_rule__XEqualityExpression__Group__0__Impl48586 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group__1__Impl_in_rule__XEqualityExpression__Group__148615 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1__0_in_rule__XEqualityExpression__Group__1__Impl48642 = new BitSet(new long[]{0x0000000001E00002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1__0__Impl_in_rule__XEqualityExpression__Group_1__048677 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1__1_in_rule__XEqualityExpression__Group_1__048680 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1_0__0_in_rule__XEqualityExpression__Group_1__0__Impl48707 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1__1__Impl_in_rule__XEqualityExpression__Group_1__148737 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__RightOperandAssignment_1_1_in_rule__XEqualityExpression__Group_1__1__Impl48764 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1_0__0__Impl_in_rule__XEqualityExpression__Group_1_0__048798 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1_0_0__0_in_rule__XEqualityExpression__Group_1_0__0__Impl48825 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1_0_0__0__Impl_in_rule__XEqualityExpression__Group_1_0_0__048857 = new BitSet(new long[]{0x0000000001E00000L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1_0_0__1_in_rule__XEqualityExpression__Group_1_0_0__048860 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__Group_1_0_0__1__Impl_in_rule__XEqualityExpression__Group_1_0_0__148918 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XEqualityExpression__FeatureAssignment_1_0_0_1_in_rule__XEqualityExpression__Group_1_0_0__1__Impl48945 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group__0__Impl_in_rule__XRelationalExpression__Group__048979 = new BitSet(new long[]{0x000000000E000000L,0x0000000000000000L,0x0000000000000000L,0x0001000000000000L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group__1_in_rule__XRelationalExpression__Group__048982 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXOtherOperatorExpression_in_rule__XRelationalExpression__Group__0__Impl49009 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group__1__Impl_in_rule__XRelationalExpression__Group__149038 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Alternatives_1_in_rule__XRelationalExpression__Group__1__Impl49065 = new BitSet(new long[]{0x000000000E000002L,0x0000000000000000L,0x0000000000000000L,0x0001000000000000L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0__0__Impl_in_rule__XRelationalExpression__Group_1_0__049100 = new BitSet(new long[]{0x0000000080000010L,0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0__1_in_rule__XRelationalExpression__Group_1_0__049103 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0_0__0_in_rule__XRelationalExpression__Group_1_0__0__Impl49130 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0__1__Impl_in_rule__XRelationalExpression__Group_1_0__149160 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__TypeAssignment_1_0_1_in_rule__XRelationalExpression__Group_1_0__1__Impl49187 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0_0__0__Impl_in_rule__XRelationalExpression__Group_1_0_0__049221 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0_0_0__0_in_rule__XRelationalExpression__Group_1_0_0__0__Impl49248 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0_0_0__0__Impl_in_rule__XRelationalExpression__Group_1_0_0_0__049280 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0001000000000000L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0_0_0__1_in_rule__XRelationalExpression__Group_1_0_0_0__049283 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_0_0_0__1__Impl_in_rule__XRelationalExpression__Group_1_0_0_0__149341 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_240_in_rule__XRelationalExpression__Group_1_0_0_0__1__Impl49369 = new BitSet(new long[]{0x0000000000000002L});
+    }
+
+    protected static class FollowSets022 {
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1__0__Impl_in_rule__XRelationalExpression__Group_1_1__049404 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1__1_in_rule__XRelationalExpression__Group_1_1__049407 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1_0__0_in_rule__XRelationalExpression__Group_1_1__0__Impl49434 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1__1__Impl_in_rule__XRelationalExpression__Group_1_1__149464 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__RightOperandAssignment_1_1_1_in_rule__XRelationalExpression__Group_1_1__1__Impl49491 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1_0__0__Impl_in_rule__XRelationalExpression__Group_1_1_0__049525 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1_0_0__0_in_rule__XRelationalExpression__Group_1_1_0__0__Impl49552 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1_0_0__0__Impl_in_rule__XRelationalExpression__Group_1_1_0_0__049584 = new BitSet(new long[]{0x000000000E000000L,0x0000000000000000L,0x0000000000000000L,0x0001000000000000L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1_0_0__1_in_rule__XRelationalExpression__Group_1_1_0_0__049587 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__Group_1_1_0_0__1__Impl_in_rule__XRelationalExpression__Group_1_1_0_0__149645 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1_in_rule__XRelationalExpression__Group_1_1_0_0__1__Impl49672 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpCompare__Group_1__0__Impl_in_rule__OpCompare__Group_1__049706 = new BitSet(new long[]{0x0000000000002000L});
+        public static final BitSet FOLLOW_rule__OpCompare__Group_1__1_in_rule__OpCompare__Group_1__049709 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_27_in_rule__OpCompare__Group_1__0__Impl49737 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpCompare__Group_1__1__Impl_in_rule__OpCompare__Group_1__149768 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_13_in_rule__OpCompare__Group_1__1__Impl49796 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group__0__Impl_in_rule__XOtherOperatorExpression__Group__049831 = new BitSet(new long[]{0x00000003FC000000L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group__1_in_rule__XOtherOperatorExpression__Group__049834 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_ruleXAdditiveExpression_in_rule__XOtherOperatorExpression__Group__0__Impl49861 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group__1__Impl_in_rule__XOtherOperatorExpression__Group__149890 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1__0_in_rule__XOtherOperatorExpression__Group__1__Impl49917 = new BitSet(new long[]{0x00000003FC000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1__0__Impl_in_rule__XOtherOperatorExpression__Group_1__049952 = new BitSet(new long[]{0x0007E10C080001F0L,0x0000000000000000L,0x0000000000080040L,0xFE28C00000000040L,0x000000000000400BL});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1__1_in_rule__XOtherOperatorExpression__Group_1__049955 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1_0__0_in_rule__XOtherOperatorExpression__Group_1__0__Impl49982 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1__1__Impl_in_rule__XOtherOperatorExpression__Group_1__150012 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__RightOperandAssignment_1_1_in_rule__XOtherOperatorExpression__Group_1__1__Impl50039 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1_0__0__Impl_in_rule__XOtherOperatorExpression__Group_1_0__050073 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1_0_0__0_in_rule__XOtherOperatorExpression__Group_1_0__0__Impl50100 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1_0_0__0__Impl_in_rule__XOtherOperatorExpression__Group_1_0_0__050132 = new BitSet(new long[]{0x00000003FC000000L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1_0_0__1_in_rule__XOtherOperatorExpression__Group_1_0_0__050135 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__Group_1_0_0__1__Impl_in_rule__XOtherOperatorExpression__Group_1_0_0__150193 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1_in_rule__XOtherOperatorExpression__Group_1_0_0__1__Impl50220 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_2__0__Impl_in_rule__OpOther__Group_2__050254 = new BitSet(new long[]{0x0000000040000000L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_2__1_in_rule__OpOther__Group_2__050257 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_26_in_rule__OpOther__Group_2__0__Impl50285 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_2__1__Impl_in_rule__OpOther__Group_2__150316 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_30_in_rule__OpOther__Group_2__1__Impl50344 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5__0__Impl_in_rule__OpOther__Group_5__050379 = new BitSet(new long[]{0x0000000004000000L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5__1_in_rule__OpOther__Group_5__050382 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_26_in_rule__OpOther__Group_5__0__Impl50410 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5__1__Impl_in_rule__OpOther__Group_5__150441 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Alternatives_5_1_in_rule__OpOther__Group_5__1__Impl50468 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5_1_0__0__Impl_in_rule__OpOther__Group_5_1_0__050502 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5_1_0_0__0_in_rule__OpOther__Group_5_1_0__0__Impl50529 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5_1_0_0__0__Impl_in_rule__OpOther__Group_5_1_0_0__050561 = new BitSet(new long[]{0x0000000004000000L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5_1_0_0__1_in_rule__OpOther__Group_5_1_0_0__050564 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_26_in_rule__OpOther__Group_5_1_0_0__0__Impl50592 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_5_1_0_0__1__Impl_in_rule__OpOther__Group_5_1_0_0__150623 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_26_in_rule__OpOther__Group_5_1_0_0__1__Impl50651 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6__0__Impl_in_rule__OpOther__Group_6__050686 = new BitSet(new long[]{0x0000000088000000L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6__1_in_rule__OpOther__Group_6__050689 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_27_in_rule__OpOther__Group_6__0__Impl50717 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6__1__Impl_in_rule__OpOther__Group_6__150748 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Alternatives_6_1_in_rule__OpOther__Group_6__1__Impl50775 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6_1_0__0__Impl_in_rule__OpOther__Group_6_1_0__050809 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6_1_0_0__0_in_rule__OpOther__Group_6_1_0__0__Impl50836 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6_1_0_0__0__Impl_in_rule__OpOther__Group_6_1_0_0__050868 = new BitSet(new long[]{0x0000000008000000L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6_1_0_0__1_in_rule__OpOther__Group_6_1_0_0__050871 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_27_in_rule__OpOther__Group_6_1_0_0__0__Impl50899 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__OpOther__Group_6_1_0_0__1__Impl_in_rule__OpOther__Group_6_1_0_0__150930 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_27_in_rule__OpOther__Group_6_1_0_0__1__Impl50958 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_rule__XAdditiveExpression__Group__0__Impl_in_rule__XAdditiveExpression__Group__050993 = new BitSet(new long[]{0x0000000C00000000L});
+        public static final BitSet FOLLOW_rule__XAdditiveExpression__Group__1_in_rule__XAdditiveExpression__Group__050996 = new BitSet(new long[]{0x0000000000000002L});
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/internal/StatemachineDSLActivator.java b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/internal/StatemachineDSLActivator.java
new file mode 100644
index 0000000..df15cb1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src-gen/org/eclipse/osbp/xtext/statemachine/ui/internal/StatemachineDSLActivator.java
@@ -0,0 +1,105 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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 StatemachineDSLActivator extends AbstractUIPlugin {
+	
+	public static final String ORG_ECLIPSE_OSBP_XTEXT_STATEMACHINE_STATEMACHINEDSL = "org.eclipse.osbp.xtext.statemachine.StatemachineDSL";
+	
+	private static final Logger logger = Logger.getLogger(StatemachineDSLActivator.class);
+	
+	private static StatemachineDSLActivator 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 StatemachineDSLActivator 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_STATEMACHINE_STATEMACHINEDSL.equals(grammar)) {
+			return new org.eclipse.osbp.xtext.statemachine.StatemachineDSLRuntimeModule();
+		}
+		
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getUiModule(String grammar) {
+		if (ORG_ECLIPSE_OSBP_XTEXT_STATEMACHINE_STATEMACHINEDSL.equals(grammar)) {
+			return new org.eclipse.osbp.xtext.statemachine.ui.StatemachineDSLUiModule(this);
+		}
+		
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getSharedStateModule() {
+		return new SharedStateModule();
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/StatemachineDSLUiModule.java b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/StatemachineDSLUiModule.java
new file mode 100644
index 0000000..ec2be95
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/StatemachineDSLUiModule.java
@@ -0,0 +1,15 @@
+/*
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.ui;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * Use this class to register components to be used within the IDE.
+ */
+public class StatemachineDSLUiModule extends org.eclipse.osbp.xtext.statemachine.ui.AbstractStatemachineDSLUiModule {
+	public StatemachineDSLUiModule(AbstractUIPlugin plugin) {
+		super(plugin);
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/contentassist/StatemachineDSLProposalProvider.xtend b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/contentassist/StatemachineDSLProposalProvider.xtend
new file mode 100644
index 0000000..8737199
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/contentassist/StatemachineDSLProposalProvider.xtend
@@ -0,0 +1,102 @@
+/*
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.ui.contentassist
+
+import javax.inject.Inject
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.osbp.fork.mihalis.opal.widgets.ImageSelectorDialog
+import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper
+import org.eclipse.swt.graphics.Point
+import org.eclipse.swt.layout.FillLayout
+import org.eclipse.swt.widgets.Shell
+import org.eclipse.xtext.Assignment
+import org.eclipse.xtext.Keyword
+import org.eclipse.xtext.RuleCall
+import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider
+import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor
+import org.eclipse.xtext.ui.editor.contentassist.ReplacementTextApplier
+
+class ImageFileNameTextApplier extends ReplacementTextApplier {
+	var ContentAssistContext context
+	var String[] extensions
+
+	def setContext(ContentAssistContext context) {
+		this.context = context
+	}
+
+	def setExtensions(String[] fileExtensions) {
+		extensions = fileExtensions
+	}
+
+	// this will inject a file dialog when selecting the file picker proposal 
+	override getActualReplacementString(ConfigurableCompletionProposal proposal) {
+		var display = context.getViewer().getTextWidget().getDisplay();
+		var shell = new Shell(display);
+		shell.setLocation(new Point(display.activeShell.location.x + 30, display.activeShell.location.y + 30))
+		shell.setLayout(new FillLayout());
+		var imageSelectorDialog = new ImageSelectorDialog(shell, 16);
+		imageSelectorDialog.setFilterExtensions(extensions)
+		var imageFileName = imageSelectorDialog.open(true);
+		return "\"".concat(imageFileName).concat("\"");
+	}
+}
+
+/**
+ * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant
+ */
+class StatemachineDSLProposalProvider extends AbstractStatemachineDSLProposalProvider {
+	@Inject TerminalsProposalProvider provider
+	@Inject BasicDSLProposalProviderHelper providerHelper
+
+	/**
+	 * This override will enable 1 length non letter characters as keyword.
+	 */
+	override protected boolean isKeywordWorthyToPropose(Keyword keyword) {
+		return true;
+	}
+
+	override protected boolean isValidProposal(String proposal, String prefix, ContentAssistContext context) {
+		var result = super.isValidProposal(proposal, prefix, context);
+		return result;
+	}
+
+	def isActionValidProposal(EObject obj, String proposal, boolean result) {
+		return true
+	}
+
+		
+//	override completeStatemachineActionButton_Image(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+//		imageFilePickerProposal(model, assignment, context, acceptor, ".jpg,.jpeg,.png")
+//	}
+
+	def imageFilePickerProposal(EObject model, Assignment assignment, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor, String fileExtensions) {
+		var fileName = createCompletionProposal("Select image file...", context) as ConfigurableCompletionProposal
+		if (fileName != null) {
+			var applier = new ImageFileNameTextApplier()
+			applier.setExtensions(fileExtensions.split(","))
+			applier.setContext(context)
+			fileName.setTextApplier = applier
+		}
+		acceptor.accept(fileName)
+	}
+
+	override public void complete_QualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this)
+	}
+
+	override public void complete_QualifiedNameWithWildcard(EObject model, RuleCall ruleCall,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this)
+	}
+
+	// ------------------------ delegates to TerminalsProposalProvider -----------------
+	override public void complete_TRANSLATABLESTRING(EObject model, RuleCall ruleCall, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		provider.complete_STRING(model, ruleCall, context, acceptor)
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLDescriptionLabelProvider.xtend b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLDescriptionLabelProvider.xtend
new file mode 100644
index 0000000..fee5b49
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLDescriptionLabelProvider.xtend
@@ -0,0 +1,24 @@
+/*
+* generated by Xtext
+*/
+package org.eclipse.osbp.xtext.statemachine.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 StatemachineDSLDescriptionLabelProvider 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.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLLabelProvider.xtend b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLLabelProvider.xtend
new file mode 100644
index 0000000..704617e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLLabelProvider.xtend
@@ -0,0 +1,29 @@
+/*
+* generated by Xtext
+*/
+package org.eclipse.osbp.xtext.statemachine.ui.labeling
+
+import com.google.inject.Inject
+
+/**
+ * Provides labels for a EObjects.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
+ */
+class StatemachineDSLLabelProvider extends org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider {
+
+	@Inject
+	new(org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider delegate) {
+		super(delegate);
+	}
+
+	// Labels and icons can be computed like this:
+	
+//	def text(Greeting ele) {
+//		'A greeting to ' + ele.name
+//	}
+//
+//	def image(Greeting ele) {
+//		'Greeting.gif'
+//	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/outline/StatemachineDSLOutlineTreeProvider.xtend b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/outline/StatemachineDSLOutlineTreeProvider.xtend
new file mode 100644
index 0000000..3837bb0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/outline/StatemachineDSLOutlineTreeProvider.xtend
@@ -0,0 +1,13 @@
+/*
+* generated by Xtext
+*/
+package org.eclipse.osbp.xtext.statemachine.ui.outline
+
+/**
+ * Customization of the default outline structure.
+ *
+ * see http://www.eclipse.org/Xtext/documentation.html#outline
+ */
+class StatemachineDSLOutlineTreeProvider extends org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider {
+	
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/quickfix/StatemachineDSLQuickfixProvider.xtend b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/quickfix/StatemachineDSLQuickfixProvider.xtend
new file mode 100644
index 0000000..63d8aff
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/src/org/eclipse/osbp/xtext/statemachine/ui/quickfix/StatemachineDSLQuickfixProvider.xtend
@@ -0,0 +1,26 @@
+/*
+* generated by Xtext
+*/
+package org.eclipse.osbp.xtext.statemachine.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 StatemachineDSLQuickfixProvider extends org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider {
+
+//	@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.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/.ImageFileNameTextApplier.java._trace b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/.ImageFileNameTextApplier.java._trace
new file mode 100644
index 0000000..e4abc6f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/.ImageFileNameTextApplier.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/.StatemachineDSLProposalProvider.java._trace b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/.StatemachineDSLProposalProvider.java._trace
new file mode 100644
index 0000000..3d4101b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/.StatemachineDSLProposalProvider.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/ImageFileNameTextApplier.java b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/ImageFileNameTextApplier.java
new file mode 100644
index 0000000..8bd56b5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/ImageFileNameTextApplier.java
@@ -0,0 +1,46 @@
+/**
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.ui.contentassist;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.osbp.fork.mihalis.opal.widgets.ImageSelectorDialog;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ReplacementTextApplier;
+
+@SuppressWarnings("all")
+public class ImageFileNameTextApplier extends ReplacementTextApplier {
+  private ContentAssistContext context;
+  
+  private String[] extensions;
+  
+  public ContentAssistContext setContext(final ContentAssistContext context) {
+    return this.context = context;
+  }
+  
+  public String[] setExtensions(final String[] fileExtensions) {
+    return this.extensions = fileExtensions;
+  }
+  
+  public String getActualReplacementString(final ConfigurableCompletionProposal proposal) {
+    ITextViewer _viewer = this.context.getViewer();
+    StyledText _textWidget = _viewer.getTextWidget();
+    Display display = _textWidget.getDisplay();
+    Shell shell = new Shell(display);
+    Point _point = new Point((display.getActiveShell().getLocation().x + 30), (display.getActiveShell().getLocation().y + 30));
+    shell.setLocation(_point);
+    FillLayout _fillLayout = new FillLayout();
+    shell.setLayout(_fillLayout);
+    ImageSelectorDialog imageSelectorDialog = new ImageSelectorDialog(shell, 16);
+    imageSelectorDialog.setFilterExtensions(this.extensions);
+    String imageFileName = imageSelectorDialog.open(true);
+    String _concat = "\"".concat(imageFileName);
+    return _concat.concat("\"");
+  }
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/StatemachineDSLProposalProvider.java b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/StatemachineDSLProposalProvider.java
new file mode 100644
index 0000000..6a0d417
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/contentassist/StatemachineDSLProposalProvider.java
@@ -0,0 +1,73 @@
+/**
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.ui.contentassist;
+
+import com.google.common.base.Objects;
+import javax.inject.Inject;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper;
+import org.eclipse.osbp.xtext.statemachine.ui.contentassist.AbstractStatemachineDSLProposalProvider;
+import org.eclipse.osbp.xtext.statemachine.ui.contentassist.ImageFileNameTextApplier;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+
+/**
+ * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant
+ */
+@SuppressWarnings("all")
+public class StatemachineDSLProposalProvider extends AbstractStatemachineDSLProposalProvider {
+  @Inject
+  private TerminalsProposalProvider provider;
+  
+  @Inject
+  private BasicDSLProposalProviderHelper providerHelper;
+  
+  /**
+   * This override will enable 1 length non letter characters as keyword.
+   */
+  protected boolean isKeywordWorthyToPropose(final Keyword keyword) {
+    return true;
+  }
+  
+  protected boolean isValidProposal(final String proposal, final String prefix, final ContentAssistContext context) {
+    boolean result = super.isValidProposal(proposal, prefix, context);
+    return result;
+  }
+  
+  public boolean isActionValidProposal(final EObject obj, final String proposal, final boolean result) {
+    return true;
+  }
+  
+  public void imageFilePickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final String fileExtensions) {
+    ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select image file...", context);
+    ConfigurableCompletionProposal fileName = ((ConfigurableCompletionProposal) _createCompletionProposal);
+    boolean _notEquals = (!Objects.equal(fileName, null));
+    if (_notEquals) {
+      ImageFileNameTextApplier applier = new ImageFileNameTextApplier();
+      String[] _split = fileExtensions.split(",");
+      applier.setExtensions(_split);
+      applier.setContext(context);
+      fileName.setTextApplier(applier);
+    }
+    acceptor.accept(fileName);
+  }
+  
+  public void complete_QualifiedName(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this);
+  }
+  
+  public void complete_QualifiedNameWithWildcard(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this);
+  }
+  
+  public void complete_TRANSLATABLESTRING(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.provider.complete_STRING(model, ruleCall, context, acceptor);
+  }
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/.StatemachineDSLDescriptionLabelProvider.java._trace b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/.StatemachineDSLDescriptionLabelProvider.java._trace
new file mode 100644
index 0000000..966a4d6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/.StatemachineDSLDescriptionLabelProvider.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/.StatemachineDSLLabelProvider.java._trace b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/.StatemachineDSLLabelProvider.java._trace
new file mode 100644
index 0000000..5371fa4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/.StatemachineDSLLabelProvider.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLDescriptionLabelProvider.java b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLDescriptionLabelProvider.java
new file mode 100644
index 0000000..bbe9f05
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLDescriptionLabelProvider.java
@@ -0,0 +1,15 @@
+/**
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.ui.labeling;
+
+import org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider;
+
+/**
+ * Provides labels for a IEObjectDescriptions and IResourceDescriptions.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
+ */
+@SuppressWarnings("all")
+public class StatemachineDSLDescriptionLabelProvider extends DefaultDescriptionLabelProvider {
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLLabelProvider.java b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLLabelProvider.java
new file mode 100644
index 0000000..07f984f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/labeling/StatemachineDSLLabelProvider.java
@@ -0,0 +1,21 @@
+/**
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.ui.labeling;
+
+import com.google.inject.Inject;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider;
+
+/**
+ * Provides labels for a EObjects.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
+ */
+@SuppressWarnings("all")
+public class StatemachineDSLLabelProvider extends DefaultEObjectLabelProvider {
+  @Inject
+  public StatemachineDSLLabelProvider(final AdapterFactoryLabelProvider delegate) {
+    super(delegate);
+  }
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/outline/.StatemachineDSLOutlineTreeProvider.java._trace b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/outline/.StatemachineDSLOutlineTreeProvider.java._trace
new file mode 100644
index 0000000..1974872
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/outline/.StatemachineDSLOutlineTreeProvider.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/outline/StatemachineDSLOutlineTreeProvider.java b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/outline/StatemachineDSLOutlineTreeProvider.java
new file mode 100644
index 0000000..4c45ae5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/outline/StatemachineDSLOutlineTreeProvider.java
@@ -0,0 +1,15 @@
+/**
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.ui.outline;
+
+import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider;
+
+/**
+ * Customization of the default outline structure.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#outline
+ */
+@SuppressWarnings("all")
+public class StatemachineDSLOutlineTreeProvider extends DefaultOutlineTreeProvider {
+}
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/quickfix/.StatemachineDSLQuickfixProvider.java._trace b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/quickfix/.StatemachineDSLQuickfixProvider.java._trace
new file mode 100644
index 0000000..95970b7
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/quickfix/.StatemachineDSLQuickfixProvider.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/quickfix/StatemachineDSLQuickfixProvider.java b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/quickfix/StatemachineDSLQuickfixProvider.java
new file mode 100644
index 0000000..7a844af
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine.ui/xtend-gen/org/eclipse/osbp/xtext/statemachine/ui/quickfix/StatemachineDSLQuickfixProvider.java
@@ -0,0 +1,15 @@
+/**
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.ui.quickfix;
+
+import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider;
+
+/**
+ * Custom quickfixes.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#quickfixes
+ */
+@SuppressWarnings("all")
+public class StatemachineDSLQuickfixProvider extends DefaultQuickfixProvider {
+}
diff --git "a/org.eclipse.osbp.xtext.statemachine/.launch/Generate Language Infrastructure \050org.eclipse.osbp.xtext.statemachine\051.launch" "b/org.eclipse.osbp.xtext.statemachine/.launch/Generate Language Infrastructure \050org.eclipse.osbp.xtext.statemachine\051.launch"
new file mode 100644
index 0000000..fd6ee3c
--- /dev/null
+++ "b/org.eclipse.osbp.xtext.statemachine/.launch/Generate Language Infrastructure \050org.eclipse.osbp.xtext.statemachine\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.statemachine&quot; type=&quot;4&quot;/&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/org.eclipse.osbp.xtext.statemachine.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.statemachine.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.statemachine.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.statemachine"/>
+</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/eclipse/osbp/xtext/statemachine/GenerateStatemachineDSL.mwe2"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osbp.xtext.statemachine"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m"/>
+</launchConfiguration>
diff --git a/org.eclipse.osbp.xtext.statemachine/.project b/org.eclipse.osbp.xtext.statemachine/.project
new file mode 100644
index 0000000..223999b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/.project
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.statemachine</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.statemachine/LICENSE.txt b/org.eclipse.osbp.xtext.statemachine/LICENSE.txt
new file mode 100644
index 0000000..ff42ad4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/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.statemachine/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.statemachine/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2bb1842
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/META-INF/MANIFEST.MF
@@ -0,0 +1,103 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osbp.xtext.statemachine
+Bundle-Vendor: Eclipse OSBP
+Bundle-Version: 0.9.0.qualifier
+Bundle-SymbolicName: org.eclipse.osbp.xtext.statemachine;singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.slf4j.api,
+ org.apache.xerces;bundle-version="2.9.0",
+ org.eclipse.osgi.services;bundle-version="3.4.0",
+ org.eclipse.xtext.generator;bundle-version="[2.7.3,2.8.0)";resolution:=optional,
+ org.eclipse.xtext.xbase;bundle-version="[2.7.3,2.8.0)";resolution:=optional;visibility:=reexport,
+ org.eclipse.xtext;bundle-version="[2.7.3,2.8.0)",
+ org.apache.commons.logging;resolution:=optional,
+ org.eclipse.emf.codegen.ecore;resolution:=optional,
+ org.eclipse.emf.mwe.utils;resolution:=optional,
+ org.eclipse.xtext.util;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.emf.common,
+ org.antlr.runtime,
+ org.eclipse.xtext.common.types;bundle-version="[2.7.3,2.8.0)";visibility:=reexport,
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.emf.ecore.xcore.lib,
+ javax.persistence;bundle-version="2.1.0",
+ com.vaadin.shared;bundle-version="[7.5.7,7.7.0)",
+ com.vaadin.server;bundle-version="[7.5.7,7.7.0)",
+ com.vaadin.client;bundle-version="[7.5.7,7.7.0)",
+ org.eclipse.e4.core.contexts;bundle-version="1.3.0",
+ org.eclipse.e4.ui.model.workbench;bundle-version="1.0.0",
+ org.eclipse.e4.core.services;bundle-version="1.1.0",
+ org.eclipse.emf.ecore.xcore,
+ org.eclipse.persistence.core;bundle-version="2.6.0",
+ org.eclipse.osbp.runtime.web.vaadin.databinding;bundle-version="[0.9.0,0.10.0)",
+ org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional,
+ org.milyn.smooks.osgi;bundle-version="1.5.1",
+ org.eclipse.core.databinding,
+ org.eclipse.core.databinding.beans,
+ org.eclipse.osbp.dsl.entity.xtext;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.dsl.common.xtext;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.dsl.xtext.lazyresolver;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.dsl.xtext.lazyresolver.api;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.preferences;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.datainterchange.common;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.osgi.hybrid.api;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.dsl.mwe;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
+ org.eclipse.emf.mwe2.launch;bundle-version="2.7.1";resolution:=optional,
+ org.eclipse.osbp.gitinfo;bundle-version="[0.9.0,0.10.0)",
+ org.apache.commons.lang;bundle-version="2.6.0",
+ org.eclipse.persistence.jpa;bundle-version="2.6.0",
+ org.eclipse.osbp.xtext.addons;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.basic;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.builder.types.bundles;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.builder.types.loader.api;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.builder.types.loader.runtime;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.builder.xbase.setups;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.dsl.dto.xtext;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.functionlibrarydsl;bundle-version="0.9.0",
+ org.eclipse.osbp.abstractstatemachine;bundle-version="0.9.0",
+ org.eclipse.osbp.fork.jpos;bundle-version="1.14.0",
+ org.eclipse.osbp.ecview.core.extension.model;bundle-version="0.9.0",
+ org.eclipse.osbp.dsl.datatype.lib;bundle-version="0.9.0",
+ org.eclipse.osbp.xtext.reportdsl;bundle-version="0.9.0"
+Import-Package: javax.transaction.xa;version="[1.0.1,2.0.0)",
+ javax.validation,
+ javax.validation.constraints,
+ org.apache.log4j,
+ org.eclipse.e4.core.di.extensions,
+ org.eclipse.jdt.core,
+ org.eclipse.osbp.dsl.dto.lib.services;version="0.9.0",
+ org.eclipse.osbp.eventbroker;version="0.9.0",
+ org.eclipse.osbp.persistence;version="0.9.0",
+ org.eclipse.osbp.ui.api.functionlibrary;version="0.9.0",
+ org.eclipse.osbp.ui.api.message;version="0.9.0",
+ org.eclipse.osbp.ui.api.metadata;version="0.9.0",
+ org.eclipse.osbp.ui.api.report;version="0.9.0",
+ org.eclipse.osbp.ui.api.statemachine;version="0.9.0",
+ org.eclipse.osbp.ui.api.themes;version="0.9.0",
+ org.eclipse.osbp.ui.api.user;version="0.9.0",
+ org.eclipse.osbp.utils.annotation;version="0.9.0",
+ org.eclipse.osbp.utils.constants;version="0.9.0",
+ org.eclipse.osbp.utils.entityhelper;version="0.9.0",
+ org.eclipse.osbp.utils.entitymock;version="0.9.0",
+ org.eclipse.osbp.utils.xtext;version="0.9.0",
+ org.eclipse.osbp.xtext.basic.generator;version="0.9.0";resolution:=optional,
+ org.eclipse.osbp.xtext.i18n;version="0.9.0",
+ org.joda.time;version="2.7.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osbp.xtext.statemachine,
+ org.eclipse.osbp.xtext.statemachine.formatting,
+ org.eclipse.osbp.xtext.statemachine.impl,
+ org.eclipse.osbp.xtext.statemachine.jvmmodel,
+ org.eclipse.osbp.xtext.statemachine.parser.antlr,
+ org.eclipse.osbp.xtext.statemachine.parser.antlr.internal,
+ org.eclipse.osbp.xtext.statemachine.scoping,
+ org.eclipse.osbp.xtext.statemachine.serializer,
+ org.eclipse.osbp.xtext.statemachine.services,
+ org.eclipse.osbp.xtext.statemachine.util,
+ org.eclipse.osbp.xtext.statemachine.validation,
+ org.eclipse.osbp.xtext.statemachine.valueconverter
+Bundle-Activator: org.eclipse.osbp.xtext.statemachine.Activator
+
diff --git a/org.eclipse.osbp.xtext.statemachine/README.txt b/org.eclipse.osbp.xtext.statemachine/README.txt
new file mode 100644
index 0000000..68755a2
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/README.txt
@@ -0,0 +1,16 @@
+Your code for xtext.statemachine goes in here.
+
+Add all your sources as you usually do for plugin development.
+
+If you need more bundles to implement the feature, duplicate this folder and ad the new bundle code into the copy
+
+Do not forget to add your new bundle to the 
+ - feature pom.xml
+ - feature feature.xml
+ - and the aggregator pom.xml
+as it is done for this bundle.
+
+Have fun!
+
+
+You can delete this file from the final project.
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.statemachine/about.html b/org.eclipse.osbp.xtext.statemachine/about.html
new file mode 100644
index 0000000..64c0598
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/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.statemachine/about.ini b/org.eclipse.osbp.xtext.statemachine/about.ini
new file mode 100644
index 0000000..7df671f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/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.statemachine/about.mappings b/org.eclipse.osbp.xtext.statemachine/about.mappings
new file mode 100644
index 0000000..4511a0a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/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.statemachine/about.properties b/org.eclipse.osbp.xtext.statemachine/about.properties
new file mode 100644
index 0000000..645c452
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/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:
+#    Loetz GmbH&Co - initial API and implementation
+#
+
+# NLS_MESSAGEFORMAT_VAR
+
+featureName=xtext.statemachine
+
+################ 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\
+    Loetz GmbH&Co - implementation\n
+################ end of blurb property ####################################
diff --git a/org.eclipse.osbp.xtext.statemachine/about_files/README.txt b/org.eclipse.osbp.xtext.statemachine/about_files/README.txt
new file mode 100644
index 0000000..cc50489
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/about_files/README.txt
@@ -0,0 +1 @@
+All external licenses referenced in about file go here
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.statemachine/build.properties b/org.eclipse.osbp.xtext.statemachine/build.properties
new file mode 100644
index 0000000..cc2223a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/build.properties
@@ -0,0 +1,10 @@
+source.. = src/,\
+          src-gen/,\
+          emf-gen/,\
+          xtend-gen/
+bin.includes = model/,\
+               META-INF/,\
+               .,\
+               plugin.xml,\
+               LICENSE.txt
+
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/Statemachine.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/Statemachine.java
new file mode 100644
index 0000000..33785e6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/Statemachine.java
@@ -0,0 +1,222 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryStatemachineGroup;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.Statemachine#isDescription <em>Description</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getDescriptionValue <em>Description Value</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getFunctionGroup <em>Function Group</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getInitialEvent <em>Initial Event</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getInitialState <em>Initial State</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getEvents <em>Events</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getControls <em>Controls</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getStates <em>States</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine()
+ * @model
+ * @generated
+ */
+public interface Statemachine extends StatemachineBase {
+	/**
+	 * Returns the value of the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Description</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Description</em>' attribute.
+	 * @see #setDescription(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine_Description()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isDescription();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#isDescription <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Description</em>' attribute.
+	 * @see #isDescription()
+	 * @generated
+	 */
+	void setDescription(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Description Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Description Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Description Value</em>' attribute.
+	 * @see #setDescriptionValue(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine_DescriptionValue()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getDescriptionValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getDescriptionValue <em>Description Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Description Value</em>' attribute.
+	 * @see #getDescriptionValue()
+	 * @generated
+	 */
+	void setDescriptionValue(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Function Group</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Function Group</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Function Group</em>' reference.
+	 * @see #setFunctionGroup(FunctionLibraryStatemachineGroup)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine_FunctionGroup()
+	 * @model
+	 * @generated
+	 */
+	FunctionLibraryStatemachineGroup getFunctionGroup();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getFunctionGroup <em>Function Group</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Function Group</em>' reference.
+	 * @see #getFunctionGroup()
+	 * @generated
+	 */
+	void setFunctionGroup(FunctionLibraryStatemachineGroup value);
+
+	/**
+	 * Returns the value of the '<em><b>Initial Event</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Initial Event</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Initial Event</em>' reference.
+	 * @see #setInitialEvent(StatemachineEvent)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine_InitialEvent()
+	 * @model
+	 * @generated
+	 */
+	StatemachineEvent getInitialEvent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getInitialEvent <em>Initial Event</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Initial Event</em>' reference.
+	 * @see #getInitialEvent()
+	 * @generated
+	 */
+	void setInitialEvent(StatemachineEvent value);
+
+	/**
+	 * Returns the value of the '<em><b>Initial State</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Initial State</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Initial State</em>' reference.
+	 * @see #setInitialState(StatemachineState)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine_InitialState()
+	 * @model
+	 * @generated
+	 */
+	StatemachineState getInitialState();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getInitialState <em>Initial State</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Initial State</em>' reference.
+	 * @see #getInitialState()
+	 * @generated
+	 */
+	void setInitialState(StatemachineState value);
+
+	/**
+	 * Returns the value of the '<em><b>Events</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineEvent}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Events</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Events</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine_Events()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineEvent> getEvents();
+
+	/**
+	 * Returns the value of the '<em><b>Controls</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineControl}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Controls</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Controls</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine_Controls()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineControl> getControls();
+
+	/**
+	 * Returns the value of the '<em><b>States</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineState}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>States</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>States</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachine_States()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineState> getStates();
+
+} // Statemachine
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineAction.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineAction.java
new file mode 100644
index 0000000..22c82e6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineAction.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineAction()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface StatemachineAction extends StatemachineLazyResolver {
+} // StatemachineAction
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionButtonCaption.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionButtonCaption.java
new file mode 100644
index 0000000..27df4c9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionButtonCaption.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Button Caption</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption#getCaption <em>Caption</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionButtonCaption()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionButtonCaption extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlButtonAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionButtonCaption_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlButtonAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlButtonAttribute value);
+
+	/**
+	 * Returns the value of the '<em><b>Caption</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Caption</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Caption</em>' containment reference.
+	 * @see #setCaption(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionButtonCaption_Caption()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getCaption();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption#getCaption <em>Caption</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Caption</em>' containment reference.
+	 * @see #getCaption()
+	 * @generated
+	 */
+	void setCaption(StatemachineActionFieldConcatenation value);
+
+} // StatemachineActionButtonCaption
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionButtonImage.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionButtonImage.java
new file mode 100644
index 0000000..c587e82
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionButtonImage.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Button Image</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage#getImage <em>Image</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionButtonImage()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionButtonImage extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlButtonAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionButtonImage_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlButtonAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlButtonAttribute value);
+
+	/**
+	 * Returns the value of the '<em><b>Image</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Image</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Image</em>' attribute.
+	 * @see #setImage(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionButtonImage_Image()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getImage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage#getImage <em>Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Image</em>' attribute.
+	 * @see #getImage()
+	 * @generated
+	 */
+	void setImage(String value);
+
+} // StatemachineActionButtonImage
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionConditionalTransition.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionConditionalTransition.java
new file mode 100644
index 0000000..f4659ec
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionConditionalTransition.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Conditional Transition</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getTransition <em>Transition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getGuard <em>Guard</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getActions <em>Actions</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionConditionalTransition()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionConditionalTransition extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Transition</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Transition</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Transition</em>' reference.
+	 * @see #setTransition(StatemachineState)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionConditionalTransition_Transition()
+	 * @model
+	 * @generated
+	 */
+	StatemachineState getTransition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getTransition <em>Transition</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Transition</em>' reference.
+	 * @see #getTransition()
+	 * @generated
+	 */
+	void setTransition(StatemachineState value);
+
+	/**
+	 * Returns the value of the '<em><b>Guard</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Guard</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Guard</em>' containment reference.
+	 * @see #setGuard(StatemachineGuard)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionConditionalTransition_Guard()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineGuard getGuard();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getGuard <em>Guard</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Guard</em>' containment reference.
+	 * @see #getGuard()
+	 * @generated
+	 */
+	void setGuard(StatemachineGuard value);
+
+	/**
+	 * Returns the value of the '<em><b>Actions</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineAction}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Actions</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Actions</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionConditionalTransition_Actions()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineAction> getActions();
+
+} // StatemachineActionConditionalTransition
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionDTOFind.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionDTOFind.java
new file mode 100644
index 0000000..658fece
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionDTOFind.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action DTO Find</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getDto <em>Dto</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getSearch <em>Search</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionDTOFind()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionDTOFind extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Dto</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Dto</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Dto</em>' reference.
+	 * @see #setDto(StatemachineControlDTOAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionDTOFind_Dto()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlDTOAttribute getDto();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getDto <em>Dto</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Dto</em>' reference.
+	 * @see #getDto()
+	 * @generated
+	 */
+	void setDto(StatemachineControlDTOAttribute value);
+
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(LDtoInheritedAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionDTOFind_Attribute()
+	 * @model
+	 * @generated
+	 */
+	LDtoInheritedAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(LDtoInheritedAttribute value);
+
+	/**
+	 * Returns the value of the '<em><b>Search</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Search</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Search</em>' containment reference.
+	 * @see #setSearch(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionDTOFind_Search()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getSearch();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getSearch <em>Search</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Search</em>' containment reference.
+	 * @see #getSearch()
+	 * @generated
+	 */
+	void setSearch(StatemachineActionFieldConcatenation value);
+
+} // StatemachineActionDTOFind
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldClear.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldClear.java
new file mode 100644
index 0000000..abeab50
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldClear.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Clear</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldClear()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldClear extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlFieldAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldClear_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlFieldAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlFieldAttribute value);
+
+} // StatemachineActionFieldClear
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldConcatenation.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldConcatenation.java
new file mode 100644
index 0000000..15175b6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldConcatenation.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Concatenation</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation#getFirst <em>First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation#getMore <em>More</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldConcatenation()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldConcatenation extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>First</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>First</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>First</em>' containment reference.
+	 * @see #setFirst(StatemachineActionFieldSource)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldConcatenation_First()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldSource getFirst();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation#getFirst <em>First</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>First</em>' containment reference.
+	 * @see #getFirst()
+	 * @generated
+	 */
+	void setFirst(StatemachineActionFieldSource value);
+
+	/**
+	 * Returns the value of the '<em><b>More</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>More</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>More</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldConcatenation_More()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineActionFieldSource> getMore();
+
+} // StatemachineActionFieldConcatenation
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldGet.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldGet.java
new file mode 100644
index 0000000..960e41f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldGet.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Get</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldGet()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldGet extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlFieldAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldGet_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlFieldAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlFieldAttribute value);
+
+} // StatemachineActionFieldGet
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldKeystroke.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldKeystroke.java
new file mode 100644
index 0000000..c023f01
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldKeystroke.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Keystroke</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke#getKeystroke <em>Keystroke</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldKeystroke()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldKeystroke extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlFieldAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldKeystroke_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlFieldAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlFieldAttribute value);
+
+	/**
+	 * Returns the value of the '<em><b>Keystroke</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Keystroke</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Keystroke</em>' attribute.
+	 * @see #setKeystroke(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldKeystroke_Keystroke()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getKeystroke();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke#getKeystroke <em>Keystroke</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Keystroke</em>' attribute.
+	 * @see #getKeystroke()
+	 * @generated
+	 */
+	void setKeystroke(String value);
+
+} // StatemachineActionFieldKeystroke
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldRemove.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldRemove.java
new file mode 100644
index 0000000..790f4dc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldRemove.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Remove</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldRemove()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldRemove extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlFieldAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldRemove_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlFieldAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlFieldAttribute value);
+
+} // StatemachineActionFieldRemove
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSet.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSet.java
new file mode 100644
index 0000000..40b6553
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSet.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Set</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet#getSource <em>Source</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSet()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldSet extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlFieldAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSet_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlFieldAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlFieldAttribute value);
+
+	/**
+	 * Returns the value of the '<em><b>Source</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Source</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Source</em>' containment reference.
+	 * @see #setSource(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSet_Source()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getSource();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet#getSource <em>Source</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Source</em>' containment reference.
+	 * @see #getSource()
+	 * @generated
+	 */
+	void setSource(StatemachineActionFieldConcatenation value);
+
+} // StatemachineActionFieldSet
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSource.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSource.java
new file mode 100644
index 0000000..12e048c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSource.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Source</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSource()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface StatemachineActionFieldSource extends StatemachineAction {
+} // StatemachineActionFieldSource
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceDtoAttribute.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceDtoAttribute.java
new file mode 100644
index 0000000..cae2fa6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceDtoAttribute.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Source Dto Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute#getDto <em>Dto</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceDtoAttribute()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldSourceDtoAttribute extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Dto</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Dto</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Dto</em>' reference.
+	 * @see #setDto(StatemachineControlDTOAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceDtoAttribute_Dto()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlDTOAttribute getDto();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute#getDto <em>Dto</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Dto</em>' reference.
+	 * @see #getDto()
+	 * @generated
+	 */
+	void setDto(StatemachineControlDTOAttribute value);
+
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(LDtoInheritedAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceDtoAttribute_Attribute()
+	 * @model
+	 * @generated
+	 */
+	LDtoInheritedAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(LDtoInheritedAttribute value);
+
+} // StatemachineActionFieldSourceDtoAttribute
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceEvaluate.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceEvaluate.java
new file mode 100644
index 0000000..26827c6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceEvaluate.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Source Evaluate</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate#getEvaluationtype <em>Evaluationtype</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceEvaluate()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldSourceEvaluate extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Evaluationtype</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Evaluationtype</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Evaluationtype</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType
+	 * @see #setEvaluationtype(StatemachineEvaluationType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceEvaluate_Evaluationtype()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineEvaluationType getEvaluationtype();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate#getEvaluationtype <em>Evaluationtype</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Evaluationtype</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType
+	 * @see #getEvaluationtype()
+	 * @generated
+	 */
+	void setEvaluationtype(StatemachineEvaluationType value);
+
+} // StatemachineActionFieldSourceEvaluate
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceEvent.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceEvent.java
new file mode 100644
index 0000000..6178075
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceEvent.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Source Event</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceEvent()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldSourceEvent extends StatemachineActionFieldSource {
+} // StatemachineActionFieldSourceEvent
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceNumber.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceNumber.java
new file mode 100644
index 0000000..a5cc77b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceNumber.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Source Number</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber#getValue <em>Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceNumber()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldSourceNumber extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(Double)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceNumber_Value()
+	 * @model unique="false"
+	 * @generated
+	 */
+	Double getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(Double value);
+
+} // StatemachineActionFieldSourceNumber
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceString.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceString.java
new file mode 100644
index 0000000..91cea12
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceString.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Source String</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString#getText <em>Text</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceString()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldSourceString extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text</em>' attribute.
+	 * @see #setText(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceString_Text()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getText();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString#getText <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text</em>' attribute.
+	 * @see #getText()
+	 * @generated
+	 */
+	void setText(String value);
+
+} // StatemachineActionFieldSourceString
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceTranslate.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceTranslate.java
new file mode 100644
index 0000000..347683b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionFieldSourceTranslate.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Field Source Translate</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate#getText <em>Text</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceTranslate()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionFieldSourceTranslate extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text</em>' attribute.
+	 * @see #setText(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionFieldSourceTranslate_Text()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getText();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate#getText <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text</em>' attribute.
+	 * @see #getText()
+	 * @generated
+	 */
+	void setText(String value);
+
+} // StatemachineActionFieldSourceTranslate
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionItemInvisible.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionItemInvisible.java
new file mode 100644
index 0000000..4c55a17
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionItemInvisible.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Item Invisible</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionItemInvisible()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionItemInvisible extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlVisibility)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionItemInvisible_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlVisibility getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlVisibility value);
+
+} // StatemachineActionItemInvisible
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionItemVisible.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionItemVisible.java
new file mode 100644
index 0000000..dbaef95
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionItemVisible.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Item Visible</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionItemVisible()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionItemVisible extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(StatemachineControlVisibility)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionItemVisible_Attribute()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlVisibility getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(StatemachineControlVisibility value);
+
+} // StatemachineActionItemVisible
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralBlinkRate.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralBlinkRate.java
new file mode 100644
index 0000000..adf315a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralBlinkRate.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Blink Rate</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate#getBlinkRate <em>Blink Rate</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralBlinkRate()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralBlinkRate extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralBlinkRate_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Blink Rate</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Blink Rate</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Blink Rate</em>' attribute.
+	 * @see #setBlinkRate(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralBlinkRate_BlinkRate()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getBlinkRate();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate#getBlinkRate <em>Blink Rate</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Blink Rate</em>' attribute.
+	 * @see #getBlinkRate()
+	 * @generated
+	 */
+	void setBlinkRate(int value);
+
+} // StatemachineActionPeripheralBlinkRate
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralClear.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralClear.java
new file mode 100644
index 0000000..7ff1574
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralClear.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Clear</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralClear()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralClear extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralClear_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+} // StatemachineActionPeripheralClear
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralCreateWindow.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralCreateWindow.java
new file mode 100644
index 0000000..ddec05f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralCreateWindow.java
@@ -0,0 +1,222 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Create Window</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportRow <em>Viewport Row</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportColumn <em>Viewport Column</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportHeight <em>Viewport Height</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportWidth <em>Viewport Width</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getWindowHeight <em>Window Height</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getWindowWidth <em>Window Width</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCreateWindow()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralCreateWindow extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCreateWindow_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Viewport Row</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Viewport Row</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Viewport Row</em>' attribute.
+	 * @see #setViewportRow(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCreateWindow_ViewportRow()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getViewportRow();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportRow <em>Viewport Row</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Viewport Row</em>' attribute.
+	 * @see #getViewportRow()
+	 * @generated
+	 */
+	void setViewportRow(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Viewport Column</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Viewport Column</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Viewport Column</em>' attribute.
+	 * @see #setViewportColumn(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCreateWindow_ViewportColumn()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getViewportColumn();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportColumn <em>Viewport Column</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Viewport Column</em>' attribute.
+	 * @see #getViewportColumn()
+	 * @generated
+	 */
+	void setViewportColumn(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Viewport Height</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Viewport Height</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Viewport Height</em>' attribute.
+	 * @see #setViewportHeight(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCreateWindow_ViewportHeight()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getViewportHeight();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportHeight <em>Viewport Height</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Viewport Height</em>' attribute.
+	 * @see #getViewportHeight()
+	 * @generated
+	 */
+	void setViewportHeight(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Viewport Width</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Viewport Width</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Viewport Width</em>' attribute.
+	 * @see #setViewportWidth(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCreateWindow_ViewportWidth()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getViewportWidth();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportWidth <em>Viewport Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Viewport Width</em>' attribute.
+	 * @see #getViewportWidth()
+	 * @generated
+	 */
+	void setViewportWidth(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Window Height</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Window Height</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Window Height</em>' attribute.
+	 * @see #setWindowHeight(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCreateWindow_WindowHeight()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getWindowHeight();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getWindowHeight <em>Window Height</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Window Height</em>' attribute.
+	 * @see #getWindowHeight()
+	 * @generated
+	 */
+	void setWindowHeight(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Window Width</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Window Width</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Window Width</em>' attribute.
+	 * @see #setWindowWidth(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCreateWindow_WindowWidth()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getWindowWidth();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getWindowWidth <em>Window Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Window Width</em>' attribute.
+	 * @see #getWindowWidth()
+	 * @generated
+	 */
+	void setWindowWidth(int value);
+
+} // StatemachineActionPeripheralCreateWindow
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralCursorType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralCursorType.java
new file mode 100644
index 0000000..e7a54cc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralCursorType.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Cursor Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType#getCursorType <em>Cursor Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCursorType()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralCursorType extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCursorType_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Cursor Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Cursor Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Cursor Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType
+	 * @see #setCursorType(StatemachineLineDisplayCursorType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralCursorType_CursorType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineLineDisplayCursorType getCursorType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType#getCursorType <em>Cursor Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Cursor Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType
+	 * @see #getCursorType()
+	 * @generated
+	 */
+	void setCursorType(StatemachineLineDisplayCursorType value);
+
+} // StatemachineActionPeripheralCursorType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDestroyWindow.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDestroyWindow.java
new file mode 100644
index 0000000..dcededd
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDestroyWindow.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Destroy Window</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDestroyWindow()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralDestroyWindow extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDestroyWindow_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+} // StatemachineActionPeripheralDestroyWindow
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDeviceBrightness.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDeviceBrightness.java
new file mode 100644
index 0000000..0e5a16d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDeviceBrightness.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Device Brightness</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness#getBrightness <em>Brightness</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDeviceBrightness()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralDeviceBrightness extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDeviceBrightness_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Brightness</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Brightness</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Brightness</em>' attribute.
+	 * @see #setBrightness(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDeviceBrightness_Brightness()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getBrightness();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness#getBrightness <em>Brightness</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Brightness</em>' attribute.
+	 * @see #getBrightness()
+	 * @generated
+	 */
+	void setBrightness(int value);
+
+} // StatemachineActionPeripheralDeviceBrightness
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayBitmap.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayBitmap.java
new file mode 100644
index 0000000..c5f4a8c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayBitmap.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Display Bitmap</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap#getBitmapId <em>Bitmap Id</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayBitmap()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralDisplayBitmap extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayBitmap_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Bitmap Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Bitmap Id</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Bitmap Id</em>' attribute.
+	 * @see #setBitmapId(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayBitmap_BitmapId()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getBitmapId();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap#getBitmapId <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Bitmap Id</em>' attribute.
+	 * @see #getBitmapId()
+	 * @generated
+	 */
+	void setBitmapId(int value);
+
+} // StatemachineActionPeripheralDisplayBitmap
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayText.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayText.java
new file mode 100644
index 0000000..d021b5f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayText.java
@@ -0,0 +1,144 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Display Text</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getText <em>Text</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#isHasType <em>Has Type</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getTextType <em>Text Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayText()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralDisplayText extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayText_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Text</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text</em>' containment reference.
+	 * @see #setText(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayText_Text()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getText();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getText <em>Text</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text</em>' containment reference.
+	 * @see #getText()
+	 * @generated
+	 */
+	void setText(StatemachineActionFieldConcatenation value);
+
+	/**
+	 * Returns the value of the '<em><b>Has Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Has Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Has Type</em>' attribute.
+	 * @see #setHasType(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayText_HasType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isHasType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#isHasType <em>Has Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Has Type</em>' attribute.
+	 * @see #isHasType()
+	 * @generated
+	 */
+	void setHasType(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Text Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType
+	 * @see #setTextType(StatemachineLineDisplayTextType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayText_TextType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineLineDisplayTextType getTextType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getTextType <em>Text Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType
+	 * @see #getTextType()
+	 * @generated
+	 */
+	void setTextType(StatemachineLineDisplayTextType value);
+
+} // StatemachineActionPeripheralDisplayText
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayTextAt.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayTextAt.java
new file mode 100644
index 0000000..96c6abb
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralDisplayTextAt.java
@@ -0,0 +1,198 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Display Text At</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getRow <em>Row</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getColumn <em>Column</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getText <em>Text</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#isHasType <em>Has Type</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getTextType <em>Text Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayTextAt()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralDisplayTextAt extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayTextAt_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Row</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Row</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Row</em>' attribute.
+	 * @see #setRow(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayTextAt_Row()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getRow();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getRow <em>Row</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Row</em>' attribute.
+	 * @see #getRow()
+	 * @generated
+	 */
+	void setRow(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Column</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Column</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Column</em>' attribute.
+	 * @see #setColumn(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayTextAt_Column()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getColumn();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getColumn <em>Column</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Column</em>' attribute.
+	 * @see #getColumn()
+	 * @generated
+	 */
+	void setColumn(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Text</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text</em>' containment reference.
+	 * @see #setText(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayTextAt_Text()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getText();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getText <em>Text</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text</em>' containment reference.
+	 * @see #getText()
+	 * @generated
+	 */
+	void setText(StatemachineActionFieldConcatenation value);
+
+	/**
+	 * Returns the value of the '<em><b>Has Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Has Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Has Type</em>' attribute.
+	 * @see #setHasType(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayTextAt_HasType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isHasType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#isHasType <em>Has Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Has Type</em>' attribute.
+	 * @see #isHasType()
+	 * @generated
+	 */
+	void setHasType(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Text Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType
+	 * @see #setTextType(StatemachineLineDisplayTextType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralDisplayTextAt_TextType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineLineDisplayTextType getTextType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getTextType <em>Text Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType
+	 * @see #getTextType()
+	 * @generated
+	 */
+	void setTextType(StatemachineLineDisplayTextType value);
+
+} // StatemachineActionPeripheralDisplayTextAt
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralInterCharacterWait.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralInterCharacterWait.java
new file mode 100644
index 0000000..0796518
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralInterCharacterWait.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Inter Character Wait</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait#getWait <em>Wait</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralInterCharacterWait()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralInterCharacterWait extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralInterCharacterWait_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Wait</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Wait</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Wait</em>' attribute.
+	 * @see #setWait(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralInterCharacterWait_Wait()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getWait();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait#getWait <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Wait</em>' attribute.
+	 * @see #getWait()
+	 * @generated
+	 */
+	void setWait(int value);
+
+} // StatemachineActionPeripheralInterCharacterWait
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeFormat.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeFormat.java
new file mode 100644
index 0000000..8ab749a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeFormat.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Marquee Format</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat#getFormat <em>Format</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeFormat()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralMarqueeFormat extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeFormat_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Format</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Format</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Format</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat
+	 * @see #setFormat(StatemachineLineDisplayMarqueeFormat)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeFormat_Format()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineLineDisplayMarqueeFormat getFormat();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat#getFormat <em>Format</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Format</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat
+	 * @see #getFormat()
+	 * @generated
+	 */
+	void setFormat(StatemachineLineDisplayMarqueeFormat value);
+
+} // StatemachineActionPeripheralMarqueeFormat
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeRepeatWait.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeRepeatWait.java
new file mode 100644
index 0000000..6c33aa3
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeRepeatWait.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Marquee Repeat Wait</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait#getWait <em>Wait</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeRepeatWait()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralMarqueeRepeatWait extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeRepeatWait_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Wait</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Wait</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Wait</em>' attribute.
+	 * @see #setWait(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeRepeatWait_Wait()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getWait();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait#getWait <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Wait</em>' attribute.
+	 * @see #getWait()
+	 * @generated
+	 */
+	void setWait(int value);
+
+} // StatemachineActionPeripheralMarqueeRepeatWait
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeType.java
new file mode 100644
index 0000000..40bf1ac
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeType.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Marquee Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType#getMarqueeType <em>Marquee Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeType()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralMarqueeType extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeType_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Marquee Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Marquee Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Marquee Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType
+	 * @see #setMarqueeType(StatemachineLineDisplayMarqueeType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeType_MarqueeType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineLineDisplayMarqueeType getMarqueeType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType#getMarqueeType <em>Marquee Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Marquee Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType
+	 * @see #getMarqueeType()
+	 * @generated
+	 */
+	void setMarqueeType(StatemachineLineDisplayMarqueeType value);
+
+} // StatemachineActionPeripheralMarqueeType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeUnitWait.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeUnitWait.java
new file mode 100644
index 0000000..fa0fbed
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralMarqueeUnitWait.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Marquee Unit Wait</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait#getWait <em>Wait</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeUnitWait()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralMarqueeUnitWait extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeUnitWait_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Wait</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Wait</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Wait</em>' attribute.
+	 * @see #setWait(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralMarqueeUnitWait_Wait()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getWait();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait#getWait <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Wait</em>' attribute.
+	 * @see #getWait()
+	 * @generated
+	 */
+	void setWait(int value);
+
+} // StatemachineActionPeripheralMarqueeUnitWait
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralOpenDrawer.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralOpenDrawer.java
new file mode 100644
index 0000000..f86f5b4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralOpenDrawer.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Open Drawer</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralOpenDrawer()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralOpenDrawer extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceCashDrawer)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralOpenDrawer_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceCashDrawer getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceCashDrawer value);
+
+} // StatemachineActionPeripheralOpenDrawer
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTAcknowledge.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTAcknowledge.java
new file mode 100644
index 0000000..12e1d57
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTAcknowledge.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral PT Acknowledge</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTAcknowledge()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPTAcknowledge extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePT)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTAcknowledge_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePT getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePT value);
+
+} // StatemachineActionPeripheralPTAcknowledge
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTAuthorization.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTAuthorization.java
new file mode 100644
index 0000000..71fdd7d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTAuthorization.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral PT Authorization</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization#getAmount <em>Amount</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTAuthorization()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPTAuthorization extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePT)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTAuthorization_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePT getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePT value);
+
+	/**
+	 * Returns the value of the '<em><b>Amount</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Amount</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Amount</em>' containment reference.
+	 * @see #setAmount(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTAuthorization_Amount()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getAmount();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization#getAmount <em>Amount</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Amount</em>' containment reference.
+	 * @see #getAmount()
+	 * @generated
+	 */
+	void setAmount(StatemachineActionFieldConcatenation value);
+
+} // StatemachineActionPeripheralPTAuthorization
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTClose.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTClose.java
new file mode 100644
index 0000000..51951cc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTClose.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral PT Close</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTClose()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPTClose extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePT)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTClose_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePT getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePT value);
+
+} // StatemachineActionPeripheralPTClose
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTOpen.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTOpen.java
new file mode 100644
index 0000000..0b3e297
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTOpen.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral PT Open</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getHost <em>Host</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getPort <em>Port</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTOpen()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPTOpen extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePT)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTOpen_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePT getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePT value);
+
+	/**
+	 * Returns the value of the '<em><b>Host</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Host</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Host</em>' containment reference.
+	 * @see #setHost(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTOpen_Host()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getHost();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getHost <em>Host</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Host</em>' containment reference.
+	 * @see #getHost()
+	 * @generated
+	 */
+	void setHost(StatemachineActionFieldConcatenation value);
+
+	/**
+	 * Returns the value of the '<em><b>Port</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Port</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Port</em>' containment reference.
+	 * @see #setPort(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTOpen_Port()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getPort();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getPort <em>Port</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Port</em>' containment reference.
+	 * @see #getPort()
+	 * @generated
+	 */
+	void setPort(StatemachineActionFieldConcatenation value);
+
+} // StatemachineActionPeripheralPTOpen
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTRegistration.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTRegistration.java
new file mode 100644
index 0000000..5ee80ae
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTRegistration.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral PT Registration</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getPassword <em>Password</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getConfiguration <em>Configuration</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTRegistration()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPTRegistration extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePT)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTRegistration_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePT getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePT value);
+
+	/**
+	 * Returns the value of the '<em><b>Password</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Password</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Password</em>' containment reference.
+	 * @see #setPassword(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTRegistration_Password()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getPassword();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getPassword <em>Password</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Password</em>' containment reference.
+	 * @see #getPassword()
+	 * @generated
+	 */
+	void setPassword(StatemachineActionFieldConcatenation value);
+
+	/**
+	 * Returns the value of the '<em><b>Configuration</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Configuration</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Configuration</em>' attribute.
+	 * @see #setConfiguration(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTRegistration_Configuration()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getConfiguration();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getConfiguration <em>Configuration</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Configuration</em>' attribute.
+	 * @see #getConfiguration()
+	 * @generated
+	 */
+	void setConfiguration(String value);
+
+} // StatemachineActionPeripheralPTRegistration
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTResponse.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTResponse.java
new file mode 100644
index 0000000..a5fa8e6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTResponse.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral PT Response</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTResponse()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPTResponse extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePT)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTResponse_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePT getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePT value);
+
+} // StatemachineActionPeripheralPTResponse
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTReversal.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTReversal.java
new file mode 100644
index 0000000..679ce24
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPTReversal.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral PT Reversal</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getPassword <em>Password</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getReceipt <em>Receipt</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTReversal()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPTReversal extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePT)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTReversal_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePT getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePT value);
+
+	/**
+	 * Returns the value of the '<em><b>Password</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Password</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Password</em>' containment reference.
+	 * @see #setPassword(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTReversal_Password()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getPassword();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getPassword <em>Password</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Password</em>' containment reference.
+	 * @see #getPassword()
+	 * @generated
+	 */
+	void setPassword(StatemachineActionFieldConcatenation value);
+
+	/**
+	 * Returns the value of the '<em><b>Receipt</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Receipt</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Receipt</em>' containment reference.
+	 * @see #setReceipt(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPTReversal_Receipt()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getReceipt();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getReceipt <em>Receipt</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Receipt</em>' containment reference.
+	 * @see #getReceipt()
+	 * @generated
+	 */
+	void setReceipt(StatemachineActionFieldConcatenation value);
+
+} // StatemachineActionPeripheralPTReversal
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintBarcode.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintBarcode.java
new file mode 100644
index 0000000..ac1e35a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintBarcode.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Print Barcode</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getData <em>Data</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getBarcodeType <em>Barcode Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintBarcode()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPrintBarcode extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePOSPrinter)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintBarcode_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePOSPrinter getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePOSPrinter value);
+
+	/**
+	 * Returns the value of the '<em><b>Data</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Data</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Data</em>' attribute.
+	 * @see #setData(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintBarcode_Data()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getData();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getData <em>Data</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Data</em>' attribute.
+	 * @see #getData()
+	 * @generated
+	 */
+	void setData(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Barcode Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Barcode Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Barcode Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType
+	 * @see #setBarcodeType(StatemachinePOSPrinterBarcodeType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintBarcode_BarcodeType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachinePOSPrinterBarcodeType getBarcodeType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getBarcodeType <em>Barcode Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Barcode Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType
+	 * @see #getBarcodeType()
+	 * @generated
+	 */
+	void setBarcodeType(StatemachinePOSPrinterBarcodeType value);
+
+} // StatemachineActionPeripheralPrintBarcode
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintBitmap.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintBitmap.java
new file mode 100644
index 0000000..346250e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintBitmap.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Print Bitmap</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap#getBitmapId <em>Bitmap Id</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintBitmap()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPrintBitmap extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePOSPrinter)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintBitmap_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePOSPrinter getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePOSPrinter value);
+
+	/**
+	 * Returns the value of the '<em><b>Bitmap Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Bitmap Id</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Bitmap Id</em>' attribute.
+	 * @see #setBitmapId(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintBitmap_BitmapId()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getBitmapId();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap#getBitmapId <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Bitmap Id</em>' attribute.
+	 * @see #getBitmapId()
+	 * @generated
+	 */
+	void setBitmapId(int value);
+
+} // StatemachineActionPeripheralPrintBitmap
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintCut.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintCut.java
new file mode 100644
index 0000000..5f9a371
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintCut.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Print Cut</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut#getText <em>Text</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintCut()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPrintCut extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePOSPrinter)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintCut_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePOSPrinter getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePOSPrinter value);
+
+	/**
+	 * Returns the value of the '<em><b>Text</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text</em>' containment reference.
+	 * @see #setText(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintCut_Text()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getText();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut#getText <em>Text</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text</em>' containment reference.
+	 * @see #getText()
+	 * @generated
+	 */
+	void setText(StatemachineActionFieldConcatenation value);
+
+} // StatemachineActionPeripheralPrintCut
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintNormal.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintNormal.java
new file mode 100644
index 0000000..5137d0e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintNormal.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Print Normal</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getText <em>Text</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getBarcodeType <em>Barcode Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintNormal()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPrintNormal extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePOSPrinter)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintNormal_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePOSPrinter getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePOSPrinter value);
+
+	/**
+	 * Returns the value of the '<em><b>Text</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text</em>' containment reference.
+	 * @see #setText(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintNormal_Text()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getText();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getText <em>Text</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text</em>' containment reference.
+	 * @see #getText()
+	 * @generated
+	 */
+	void setText(StatemachineActionFieldConcatenation value);
+
+	/**
+	 * Returns the value of the '<em><b>Barcode Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Barcode Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Barcode Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType
+	 * @see #setBarcodeType(StatemachinePOSPrinterBarcodeType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintNormal_BarcodeType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachinePOSPrinterBarcodeType getBarcodeType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getBarcodeType <em>Barcode Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Barcode Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType
+	 * @see #getBarcodeType()
+	 * @generated
+	 */
+	void setBarcodeType(StatemachinePOSPrinterBarcodeType value);
+
+} // StatemachineActionPeripheralPrintNormal
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintRegisterBitmap.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintRegisterBitmap.java
new file mode 100644
index 0000000..256dc95
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintRegisterBitmap.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Print Register Bitmap</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getBitmapId <em>Bitmap Id</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getName <em>Name</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintRegisterBitmap()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPrintRegisterBitmap extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDevicePOSPrinter)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintRegisterBitmap_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePOSPrinter getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDevicePOSPrinter value);
+
+	/**
+	 * Returns the value of the '<em><b>Bitmap Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Bitmap Id</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Bitmap Id</em>' attribute.
+	 * @see #setBitmapId(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintRegisterBitmap_BitmapId()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getBitmapId();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getBitmapId <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Bitmap Id</em>' attribute.
+	 * @see #getBitmapId()
+	 * @generated
+	 */
+	void setBitmapId(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintRegisterBitmap_Name()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+} // StatemachineActionPeripheralPrintRegisterBitmap
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintReport.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintReport.java
new file mode 100644
index 0000000..90fcd85
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralPrintReport.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.osbp.xtext.reportdsl.Report;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Print Report</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#getReport <em>Report</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#getKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#isHasFilter <em>Has Filter</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintReport()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralPrintReport extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Report</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Report</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Report</em>' reference.
+	 * @see #setReport(Report)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintReport_Report()
+	 * @model
+	 * @generated
+	 */
+	Report getReport();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#getReport <em>Report</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Report</em>' reference.
+	 * @see #getReport()
+	 * @generated
+	 */
+	void setReport(Report value);
+
+	/**
+	 * Returns the value of the '<em><b>Key</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Key</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Key</em>' reference.
+	 * @see #setKey(StatemachineStorage)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintReport_Key()
+	 * @model
+	 * @generated
+	 */
+	StatemachineStorage getKey();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#getKey <em>Key</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Key</em>' reference.
+	 * @see #getKey()
+	 * @generated
+	 */
+	void setKey(StatemachineStorage value);
+
+	/**
+	 * Returns the value of the '<em><b>Has Filter</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Has Filter</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Has Filter</em>' attribute.
+	 * @see #setHasFilter(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralPrintReport_HasFilter()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isHasFilter();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#isHasFilter <em>Has Filter</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Has Filter</em>' attribute.
+	 * @see #isHasFilter()
+	 * @generated
+	 */
+	void setHasFilter(boolean value);
+
+} // StatemachineActionPeripheralPrintReport
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralScroll.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralScroll.java
new file mode 100644
index 0000000..6fda8db
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionPeripheralScroll.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Peripheral Scroll</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getUnits <em>Units</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralScroll()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionPeripheralScroll extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Device</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Device</em>' reference.
+	 * @see #setDevice(StatemachinePeripheralDeviceLineDisplay)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralScroll_Device()
+	 * @model
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay getDevice();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getDevice <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Device</em>' reference.
+	 * @see #getDevice()
+	 * @generated
+	 */
+	void setDevice(StatemachinePeripheralDeviceLineDisplay value);
+
+	/**
+	 * Returns the value of the '<em><b>Direction</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Direction</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType
+	 * @see #setDirection(StatemachineLineDisplayScrollTextType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralScroll_Direction()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineLineDisplayScrollTextType getDirection();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getDirection <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType
+	 * @see #getDirection()
+	 * @generated
+	 */
+	void setDirection(StatemachineLineDisplayScrollTextType value);
+
+	/**
+	 * Returns the value of the '<em><b>Units</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Units</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Units</em>' attribute.
+	 * @see #setUnits(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionPeripheralScroll_Units()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getUnits();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getUnits <em>Units</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Units</em>' attribute.
+	 * @see #getUnits()
+	 * @generated
+	 */
+	void setUnits(int value);
+
+} // StatemachineActionPeripheralScroll
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionScheduler.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionScheduler.java
new file mode 100644
index 0000000..ab36e62
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineActionScheduler.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Action Scheduler</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler#getScheduler <em>Scheduler</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionScheduler()
+ * @model
+ * @generated
+ */
+public interface StatemachineActionScheduler extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Scheduler</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Scheduler</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Scheduler</em>' reference.
+	 * @see #setScheduler(StatemachineControlSchedulerAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineActionScheduler_Scheduler()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlSchedulerAttribute getScheduler();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler#getScheduler <em>Scheduler</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Scheduler</em>' reference.
+	 * @see #getScheduler()
+	 * @generated
+	 */
+	void setScheduler(StatemachineControlSchedulerAttribute value);
+
+} // StatemachineActionScheduler
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineBase.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineBase.java
new file mode 100644
index 0000000..4bd0a6c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineBase.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Base</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineBase#getName <em>Name</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineBase()
+ * @model
+ * @generated
+ */
+public interface StatemachineBase extends StatemachineLazyResolver {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineBase_Name()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineBase#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+} // StatemachineBase
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControl.java
new file mode 100644
index 0000000..cde0629
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControl.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControl()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface StatemachineControl extends StatemachineBase {
+} // StatemachineControl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButton.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButton.java
new file mode 100644
index 0000000..635f079
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButton.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Button</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButton#getEventType <em>Event Type</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButton#getButtons <em>Buttons</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButton()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlButton extends StatemachineControl, StatemachineControlVisibility {
+	/**
+	 * Returns the value of the '<em><b>Event Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Event Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Event Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType
+	 * @see #setEventType(StatemachineControlButtonEventType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButton_EventType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineControlButtonEventType getEventType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButton#getEventType <em>Event Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Event Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType
+	 * @see #getEventType()
+	 * @generated
+	 */
+	void setEventType(StatemachineControlButtonEventType value);
+
+	/**
+	 * Returns the value of the '<em><b>Buttons</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Buttons</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Buttons</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButton_Buttons()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineControlButtonAttribute> getButtons();
+
+} // StatemachineControlButton
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttribute.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttribute.java
new file mode 100644
index 0000000..329b22f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttribute.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Button Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#isHasImage <em>Has Image</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#getImage <em>Image</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#getEvent <em>Event</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttribute()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlButtonAttribute extends StatemachineControlVisibility {
+	/**
+	 * Returns the value of the '<em><b>Has Image</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Has Image</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Has Image</em>' attribute.
+	 * @see #setHasImage(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttribute_HasImage()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isHasImage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#isHasImage <em>Has Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Has Image</em>' attribute.
+	 * @see #isHasImage()
+	 * @generated
+	 */
+	void setHasImage(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Image</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Image</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Image</em>' attribute.
+	 * @see #setImage(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttribute_Image()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getImage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#getImage <em>Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Image</em>' attribute.
+	 * @see #getImage()
+	 * @generated
+	 */
+	void setImage(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Event</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Event</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Event</em>' containment reference.
+	 * @see #setEvent(StatemachineControlButtonAttributeEvent)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttribute_Event()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineControlButtonAttributeEvent getEvent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#getEvent <em>Event</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Event</em>' containment reference.
+	 * @see #getEvent()
+	 * @generated
+	 */
+	void setEvent(StatemachineControlButtonAttributeEvent value);
+
+} // StatemachineControlButtonAttribute
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEvent.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEvent.java
new file mode 100644
index 0000000..743a1f5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEvent.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Button Attribute Event</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttributeEvent()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface StatemachineControlButtonAttributeEvent extends StatemachineLazyResolver {
+} // StatemachineControlButtonAttributeEvent
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventEvent.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventEvent.java
new file mode 100644
index 0000000..6d58e9b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventEvent.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Button Attribute Event Event</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent#getEvent <em>Event</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttributeEventEvent()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlButtonAttributeEventEvent extends StatemachineControlButtonAttributeEvent {
+	/**
+	 * Returns the value of the '<em><b>Event</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Event</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Event</em>' reference.
+	 * @see #setEvent(StatemachineEvent)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttributeEventEvent_Event()
+	 * @model
+	 * @generated
+	 */
+	StatemachineEvent getEvent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent#getEvent <em>Event</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Event</em>' reference.
+	 * @see #getEvent()
+	 * @generated
+	 */
+	void setEvent(StatemachineEvent value);
+
+} // StatemachineControlButtonAttributeEventEvent
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventIdentity.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventIdentity.java
new file mode 100644
index 0000000..1a2a731
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventIdentity.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Button Attribute Event Identity</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity#getIdentity <em>Identity</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttributeEventIdentity()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlButtonAttributeEventIdentity extends StatemachineControlButtonAttributeEvent {
+	/**
+	 * Returns the value of the '<em><b>Identity</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Identity</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Identity</em>' attribute.
+	 * @see #setIdentity(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttributeEventIdentity_Identity()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getIdentity();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity#getIdentity <em>Identity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Identity</em>' attribute.
+	 * @see #getIdentity()
+	 * @generated
+	 */
+	void setIdentity(int value);
+
+} // StatemachineControlButtonAttributeEventIdentity
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventKeyboard.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventKeyboard.java
new file mode 100644
index 0000000..b68f20b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonAttributeEventKeyboard.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Button Attribute Event Keyboard</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard#getKeystroke <em>Keystroke</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttributeEventKeyboard()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlButtonAttributeEventKeyboard extends StatemachineControlButtonAttributeEvent {
+	/**
+	 * Returns the value of the '<em><b>Keystroke</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Keystroke</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Keystroke</em>' attribute.
+	 * @see #setKeystroke(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonAttributeEventKeyboard_Keystroke()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getKeystroke();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard#getKeystroke <em>Keystroke</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Keystroke</em>' attribute.
+	 * @see #getKeystroke()
+	 * @generated
+	 */
+	void setKeystroke(String value);
+
+} // StatemachineControlButtonAttributeEventKeyboard
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonEventType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonEventType.java
new file mode 100644
index 0000000..3c747a1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlButtonEventType.java
@@ -0,0 +1,244 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine Control Button Event Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlButtonEventType()
+ * @model
+ * @generated
+ */
+public enum StatemachineControlButtonEventType implements Enumerator {
+	/**
+	 * The '<em><b>KEYBOARD</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #KEYBOARD_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	KEYBOARD(0, "KEYBOARD", "keyboard"),
+
+	/**
+	 * The '<em><b>TRIGGER</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #TRIGGER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	TRIGGER(0, "TRIGGER", "trigger"),
+
+	/**
+	 * The '<em><b>IDENTITY</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IDENTITY_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	IDENTITY(0, "IDENTITY", "identity");
+
+	/**
+	 * The '<em><b>KEYBOARD</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>KEYBOARD</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #KEYBOARD
+	 * @model literal="keyboard"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int KEYBOARD_VALUE = 0;
+
+	/**
+	 * The '<em><b>TRIGGER</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>TRIGGER</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #TRIGGER
+	 * @model literal="trigger"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int TRIGGER_VALUE = 0;
+
+	/**
+	 * The '<em><b>IDENTITY</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>IDENTITY</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #IDENTITY
+	 * @model literal="identity"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int IDENTITY_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine Control Button Event Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineControlButtonEventType[] VALUES_ARRAY =
+		new StatemachineControlButtonEventType[] {
+			KEYBOARD,
+			TRIGGER,
+			IDENTITY,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine Control Button Event Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineControlButtonEventType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine Control Button Event Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineControlButtonEventType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineControlButtonEventType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Control Button Event Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineControlButtonEventType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineControlButtonEventType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Control Button Event Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineControlButtonEventType get(int value) {
+		switch (value) {
+			case KEYBOARD_VALUE: return KEYBOARD;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineControlButtonEventType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineControlButtonEventType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlDTO.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlDTO.java
new file mode 100644
index 0000000..b3618d8
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlDTO.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control DTO</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO#getDtos <em>Dtos</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlDTO()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlDTO extends StatemachineControl {
+	/**
+	 * Returns the value of the '<em><b>Dtos</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Dtos</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Dtos</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlDTO_Dtos()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineControlDTOAttribute> getDtos();
+
+} // StatemachineControlDTO
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlDTOAttribute.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlDTOAttribute.java
new file mode 100644
index 0000000..dfa9f9a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlDTOAttribute.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control DTO Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#getAttributeType <em>Attribute Type</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#isHasEvent <em>Has Event</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#getEvent <em>Event</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlDTOAttribute()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlDTOAttribute extends StatemachineBase {
+	/**
+	 * Returns the value of the '<em><b>Attribute Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute Type</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute Type</em>' containment reference.
+	 * @see #setAttributeType(StatemachineDTOType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlDTOAttribute_AttributeType()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineDTOType getAttributeType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#getAttributeType <em>Attribute Type</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute Type</em>' containment reference.
+	 * @see #getAttributeType()
+	 * @generated
+	 */
+	void setAttributeType(StatemachineDTOType value);
+
+	/**
+	 * Returns the value of the '<em><b>Has Event</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Has Event</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Has Event</em>' attribute.
+	 * @see #setHasEvent(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlDTOAttribute_HasEvent()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isHasEvent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#isHasEvent <em>Has Event</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Has Event</em>' attribute.
+	 * @see #isHasEvent()
+	 * @generated
+	 */
+	void setHasEvent(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Event</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Event</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Event</em>' reference.
+	 * @see #setEvent(StatemachineEvent)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlDTOAttribute_Event()
+	 * @model
+	 * @generated
+	 */
+	StatemachineEvent getEvent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#getEvent <em>Event</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Event</em>' reference.
+	 * @see #getEvent()
+	 * @generated
+	 */
+	void setEvent(StatemachineEvent value);
+
+} // StatemachineControlDTOAttribute
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlField.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlField.java
new file mode 100644
index 0000000..0d2097f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlField.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Field</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlField#getFields <em>Fields</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlField#getLayouts <em>Layouts</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlField()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlField extends StatemachineControl {
+	/**
+	 * Returns the value of the '<em><b>Fields</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Fields</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Fields</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlField_Fields()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineControlFieldAttribute> getFields();
+
+	/**
+	 * Returns the value of the '<em><b>Layouts</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Layouts</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Layouts</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlField_Layouts()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineControlFieldLayout> getLayouts();
+
+} // StatemachineControlField
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlFieldAttribute.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlFieldAttribute.java
new file mode 100644
index 0000000..d3d6823
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlFieldAttribute.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Field Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute#getAttributeType <em>Attribute Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlFieldAttribute()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlFieldAttribute extends StatemachineControlVisibility {
+	/**
+	 * Returns the value of the '<em><b>Attribute Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute Type</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute Type</em>' containment reference.
+	 * @see #setAttributeType(StatemachineFieldType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlFieldAttribute_AttributeType()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineFieldType getAttributeType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute#getAttributeType <em>Attribute Type</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute Type</em>' containment reference.
+	 * @see #getAttributeType()
+	 * @generated
+	 */
+	void setAttributeType(StatemachineFieldType value);
+
+} // StatemachineControlFieldAttribute
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlFieldLayout.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlFieldLayout.java
new file mode 100644
index 0000000..4b6b8ac
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlFieldLayout.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Field Layout</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlFieldLayout()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlFieldLayout extends StatemachineControlVisibility {
+} // StatemachineControlFieldLayout
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlPeripheral.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlPeripheral.java
new file mode 100644
index 0000000..8653f4f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlPeripheral.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Peripheral</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getLineDisplays <em>Line Displays</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getPosPrinters <em>Pos Printers</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getCashDrawers <em>Cash Drawers</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getPaymentTerminals <em>Payment Terminals</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlPeripheral()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlPeripheral extends StatemachineControl {
+	/**
+	 * Returns the value of the '<em><b>Line Displays</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Line Displays</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Line Displays</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlPeripheral_LineDisplays()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachinePeripheralDeviceLineDisplay> getLineDisplays();
+
+	/**
+	 * Returns the value of the '<em><b>Pos Printers</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Pos Printers</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Pos Printers</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlPeripheral_PosPrinters()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachinePeripheralDevicePOSPrinter> getPosPrinters();
+
+	/**
+	 * Returns the value of the '<em><b>Cash Drawers</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Cash Drawers</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Cash Drawers</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlPeripheral_CashDrawers()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachinePeripheralDeviceCashDrawer> getCashDrawers();
+
+	/**
+	 * Returns the value of the '<em><b>Payment Terminals</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Payment Terminals</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Payment Terminals</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlPeripheral_PaymentTerminals()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachinePeripheralDevicePT> getPaymentTerminals();
+
+} // StatemachineControlPeripheral
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlScheduler.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlScheduler.java
new file mode 100644
index 0000000..1383308
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlScheduler.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Scheduler</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler#getSchedulers <em>Schedulers</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlScheduler()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlScheduler extends StatemachineControl {
+	/**
+	 * Returns the value of the '<em><b>Schedulers</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Schedulers</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Schedulers</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlScheduler_Schedulers()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineControlSchedulerAttribute> getSchedulers();
+
+} // StatemachineControlScheduler
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlSchedulerAttribute.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlSchedulerAttribute.java
new file mode 100644
index 0000000..199f927
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlSchedulerAttribute.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Scheduler Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute#getDelay <em>Delay</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute#getEvent <em>Event</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlSchedulerAttribute()
+ * @model
+ * @generated
+ */
+public interface StatemachineControlSchedulerAttribute extends StatemachineBase {
+	/**
+	 * Returns the value of the '<em><b>Delay</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Delay</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Delay</em>' attribute.
+	 * @see #setDelay(int)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlSchedulerAttribute_Delay()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getDelay();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute#getDelay <em>Delay</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Delay</em>' attribute.
+	 * @see #getDelay()
+	 * @generated
+	 */
+	void setDelay(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Event</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Event</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Event</em>' reference.
+	 * @see #setEvent(StatemachineEvent)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlSchedulerAttribute_Event()
+	 * @model
+	 * @generated
+	 */
+	StatemachineEvent getEvent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute#getEvent <em>Event</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Event</em>' reference.
+	 * @see #getEvent()
+	 * @generated
+	 */
+	void setEvent(StatemachineEvent value);
+
+} // StatemachineControlSchedulerAttribute
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlVisibility.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlVisibility.java
new file mode 100644
index 0000000..29f7cb1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineControlVisibility.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Control Visibility</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineControlVisibility()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface StatemachineControlVisibility extends StatemachineBase {
+} // StatemachineControlVisibility
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLFactory.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLFactory.java
new file mode 100644
index 0000000..9144b99
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLFactory.java
@@ -0,0 +1,773 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage
+ * @generated
+ */
+public interface StatemachineDSLFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	StatemachineDSLFactory eINSTANCE = org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Model</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Model</em>'.
+	 * @generated
+	 */
+	StatemachineModel createStatemachineModel();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Lazy Resolver</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Lazy Resolver</em>'.
+	 * @generated
+	 */
+	StatemachineLazyResolver createStatemachineLazyResolver();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Base</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Base</em>'.
+	 * @generated
+	 */
+	StatemachineBase createStatemachineBase();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Package</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Package</em>'.
+	 * @generated
+	 */
+	StatemachinePackage createStatemachinePackage();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine</em>'.
+	 * @generated
+	 */
+	Statemachine createStatemachine();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Button</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Button</em>'.
+	 * @generated
+	 */
+	StatemachineControlButton createStatemachineControlButton();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Field</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Field</em>'.
+	 * @generated
+	 */
+	StatemachineControlField createStatemachineControlField();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control DTO</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control DTO</em>'.
+	 * @generated
+	 */
+	StatemachineControlDTO createStatemachineControlDTO();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Scheduler</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Scheduler</em>'.
+	 * @generated
+	 */
+	StatemachineControlScheduler createStatemachineControlScheduler();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Peripheral</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Peripheral</em>'.
+	 * @generated
+	 */
+	StatemachineControlPeripheral createStatemachineControlPeripheral();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Button Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Button Attribute</em>'.
+	 * @generated
+	 */
+	StatemachineControlButtonAttribute createStatemachineControlButtonAttribute();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Button Attribute Event Keyboard</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Button Attribute Event Keyboard</em>'.
+	 * @generated
+	 */
+	StatemachineControlButtonAttributeEventKeyboard createStatemachineControlButtonAttributeEventKeyboard();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Button Attribute Event Identity</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Button Attribute Event Identity</em>'.
+	 * @generated
+	 */
+	StatemachineControlButtonAttributeEventIdentity createStatemachineControlButtonAttributeEventIdentity();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Button Attribute Event Event</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Button Attribute Event Event</em>'.
+	 * @generated
+	 */
+	StatemachineControlButtonAttributeEventEvent createStatemachineControlButtonAttributeEventEvent();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Field Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Field Attribute</em>'.
+	 * @generated
+	 */
+	StatemachineControlFieldAttribute createStatemachineControlFieldAttribute();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Field Layout</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Field Layout</em>'.
+	 * @generated
+	 */
+	StatemachineControlFieldLayout createStatemachineControlFieldLayout();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control DTO Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control DTO Attribute</em>'.
+	 * @generated
+	 */
+	StatemachineControlDTOAttribute createStatemachineControlDTOAttribute();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Peripheral Device Line Display</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Peripheral Device Line Display</em>'.
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceLineDisplay createStatemachinePeripheralDeviceLineDisplay();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Peripheral Device POS Printer</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Peripheral Device POS Printer</em>'.
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePOSPrinter createStatemachinePeripheralDevicePOSPrinter();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Peripheral Device Cash Drawer</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Peripheral Device Cash Drawer</em>'.
+	 * @generated
+	 */
+	StatemachinePeripheralDeviceCashDrawer createStatemachinePeripheralDeviceCashDrawer();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Peripheral Device PT</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Peripheral Device PT</em>'.
+	 * @generated
+	 */
+	StatemachinePeripheralDevicePT createStatemachinePeripheralDevicePT();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Control Scheduler Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Control Scheduler Attribute</em>'.
+	 * @generated
+	 */
+	StatemachineControlSchedulerAttribute createStatemachineControlSchedulerAttribute();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Event</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Event</em>'.
+	 * @generated
+	 */
+	StatemachineEvent createStatemachineEvent();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine State</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine State</em>'.
+	 * @generated
+	 */
+	StatemachineState createStatemachineState();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Trigger</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Trigger</em>'.
+	 * @generated
+	 */
+	StatemachineTrigger createStatemachineTrigger();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Blink Rate</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Blink Rate</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralBlinkRate createStatemachineActionPeripheralBlinkRate();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Clear</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Clear</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralClear createStatemachineActionPeripheralClear();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Create Window</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Create Window</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralCreateWindow createStatemachineActionPeripheralCreateWindow();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Cursor Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Cursor Type</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralCursorType createStatemachineActionPeripheralCursorType();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Destroy Window</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Destroy Window</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralDestroyWindow createStatemachineActionPeripheralDestroyWindow();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Device Brightness</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Device Brightness</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralDeviceBrightness createStatemachineActionPeripheralDeviceBrightness();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Display Bitmap</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Display Bitmap</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralDisplayBitmap createStatemachineActionPeripheralDisplayBitmap();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Display Text</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Display Text</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralDisplayText createStatemachineActionPeripheralDisplayText();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Display Text At</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Display Text At</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralDisplayTextAt createStatemachineActionPeripheralDisplayTextAt();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Inter Character Wait</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Inter Character Wait</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralInterCharacterWait createStatemachineActionPeripheralInterCharacterWait();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Marquee Format</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Marquee Format</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralMarqueeFormat createStatemachineActionPeripheralMarqueeFormat();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Marquee Repeat Wait</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Marquee Repeat Wait</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralMarqueeRepeatWait createStatemachineActionPeripheralMarqueeRepeatWait();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Marquee Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Marquee Type</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralMarqueeType createStatemachineActionPeripheralMarqueeType();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Marquee Unit Wait</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Marquee Unit Wait</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralMarqueeUnitWait createStatemachineActionPeripheralMarqueeUnitWait();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Scroll</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Scroll</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralScroll createStatemachineActionPeripheralScroll();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Open Drawer</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Open Drawer</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralOpenDrawer createStatemachineActionPeripheralOpenDrawer();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Print Barcode</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Print Barcode</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPrintBarcode createStatemachineActionPeripheralPrintBarcode();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Print Bitmap</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Print Bitmap</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPrintBitmap createStatemachineActionPeripheralPrintBitmap();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Print Cut</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Print Cut</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPrintCut createStatemachineActionPeripheralPrintCut();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Print Register Bitmap</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Print Register Bitmap</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPrintRegisterBitmap createStatemachineActionPeripheralPrintRegisterBitmap();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Print Normal</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Print Normal</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPrintNormal createStatemachineActionPeripheralPrintNormal();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral PT Open</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral PT Open</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPTOpen createStatemachineActionPeripheralPTOpen();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral PT Close</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral PT Close</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPTClose createStatemachineActionPeripheralPTClose();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral PT Reversal</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral PT Reversal</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPTReversal createStatemachineActionPeripheralPTReversal();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral PT Acknowledge</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral PT Acknowledge</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPTAcknowledge createStatemachineActionPeripheralPTAcknowledge();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral PT Registration</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral PT Registration</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPTRegistration createStatemachineActionPeripheralPTRegistration();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral PT Authorization</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral PT Authorization</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPTAuthorization createStatemachineActionPeripheralPTAuthorization();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral PT Response</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral PT Response</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPTResponse createStatemachineActionPeripheralPTResponse();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Peripheral Print Report</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Peripheral Print Report</em>'.
+	 * @generated
+	 */
+	StatemachineActionPeripheralPrintReport createStatemachineActionPeripheralPrintReport();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Source String</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Source String</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldSourceString createStatemachineActionFieldSourceString();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Source Number</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Source Number</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldSourceNumber createStatemachineActionFieldSourceNumber();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Source Evaluate</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Source Evaluate</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldSourceEvaluate createStatemachineActionFieldSourceEvaluate();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Source Translate</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Source Translate</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldSourceTranslate createStatemachineActionFieldSourceTranslate();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Source Dto Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Source Dto Attribute</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldSourceDtoAttribute createStatemachineActionFieldSourceDtoAttribute();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Source Event</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Source Event</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldSourceEvent createStatemachineActionFieldSourceEvent();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Conditional Transition</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Conditional Transition</em>'.
+	 * @generated
+	 */
+	StatemachineActionConditionalTransition createStatemachineActionConditionalTransition();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Operation Parameter</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Operation Parameter</em>'.
+	 * @generated
+	 */
+	StatemachineOperationParameter createStatemachineOperationParameter();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Operation</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Operation</em>'.
+	 * @generated
+	 */
+	StatemachineOperation createStatemachineOperation();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Guard</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Guard</em>'.
+	 * @generated
+	 */
+	StatemachineGuard createStatemachineGuard();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Function</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Function</em>'.
+	 * @generated
+	 */
+	StatemachineFunction createStatemachineFunction();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Storage Retrieve</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Storage Retrieve</em>'.
+	 * @generated
+	 */
+	StatemachineStorageRetrieve createStatemachineStorageRetrieve();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Storage</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Storage</em>'.
+	 * @generated
+	 */
+	StatemachineStorage createStatemachineStorage();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Concatenation</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Concatenation</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation createStatemachineActionFieldConcatenation();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Set</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Set</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldSet createStatemachineActionFieldSet();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Keystroke</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Keystroke</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldKeystroke createStatemachineActionFieldKeystroke();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Clear</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Clear</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldClear createStatemachineActionFieldClear();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Get</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Get</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldGet createStatemachineActionFieldGet();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Field Remove</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Field Remove</em>'.
+	 * @generated
+	 */
+	StatemachineActionFieldRemove createStatemachineActionFieldRemove();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Item Visible</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Item Visible</em>'.
+	 * @generated
+	 */
+	StatemachineActionItemVisible createStatemachineActionItemVisible();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Item Invisible</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Item Invisible</em>'.
+	 * @generated
+	 */
+	StatemachineActionItemInvisible createStatemachineActionItemInvisible();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Button Caption</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Button Caption</em>'.
+	 * @generated
+	 */
+	StatemachineActionButtonCaption createStatemachineActionButtonCaption();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Button Image</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Button Image</em>'.
+	 * @generated
+	 */
+	StatemachineActionButtonImage createStatemachineActionButtonImage();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action DTO Find</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action DTO Find</em>'.
+	 * @generated
+	 */
+	StatemachineActionDTOFind createStatemachineActionDTOFind();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Action Scheduler</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Action Scheduler</em>'.
+	 * @generated
+	 */
+	StatemachineActionScheduler createStatemachineActionScheduler();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine DTO Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine DTO Type</em>'.
+	 * @generated
+	 */
+	StatemachineDTOType createStatemachineDTOType();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine Field Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine Field Type</em>'.
+	 * @generated
+	 */
+	StatemachineFieldType createStatemachineFieldType();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	StatemachineDSLPackage getStatemachineDSLPackage();
+
+} //StatemachineDSLFactory
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLPackage.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLPackage.java
new file mode 100644
index 0000000..36d523c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLPackage.java
@@ -0,0 +1,10108 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLFactory
+ * @model kind="package"
+ *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='statemachine' modelName='StatemachineDSL' prefix='StatemachineDSL' updateClasspath='false' copyrightText='Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)\r\n All rights reserved. This program and the accompanying materials \r\n are made available under the terms of the Eclipse Public License v1.0 \r\n which accompanies this distribution, and is available at \r\n http://www.eclipse.org/legal/epl-v10.html \r\n\r\n Based on ideas from Xtext, Xtend, Xcore\r\n  \r\n Contributors:  \r\n \t\tChristophe Loetz (Loetz GmbH&Co.KG) - Initial implementation \r\n ' basePackage='org.eclipse.osbp.xtext'"
+ *        annotation="http://www.eclipse.org/emf/2002/Ecore rootPackage='statemachinedsl'"
+ * @generated
+ */
+public interface StatemachineDSLPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "statemachine";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://osbp.eclipse.org/xtext/statemachine/StatemachineDSL";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "statemachinedsl";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	StatemachineDSLPackage eINSTANCE = org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineModelImpl <em>Statemachine Model</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineModelImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineModel()
+	 * @generated
+	 */
+	int STATEMACHINE_MODEL = 0;
+
+	/**
+	 * The feature id for the '<em><b>Packages</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_MODEL__PACKAGES = 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Model</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_MODEL_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Model</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_MODEL_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineLazyResolverImpl <em>Statemachine Lazy Resolver</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineLazyResolverImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLazyResolver()
+	 * @generated
+	 */
+	int STATEMACHINE_LAZY_RESOLVER = 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Lazy Resolver</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT = 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = 0;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Lazy Resolver</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_LAZY_RESOLVER_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineBaseImpl <em>Statemachine Base</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineBaseImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineBase()
+	 * @generated
+	 */
+	int STATEMACHINE_BASE = 2;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_BASE__NAME = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Base</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_BASE_FEATURE_COUNT = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Base</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_BASE_OPERATION_COUNT = STATEMACHINE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePackageImpl <em>Statemachine Package</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePackageImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePackage()
+	 * @generated
+	 */
+	int STATEMACHINE_PACKAGE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PACKAGE__NAME = OSBPTypesPackage.LPACKAGE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Imports</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PACKAGE__IMPORTS = OSBPTypesPackage.LPACKAGE__IMPORTS;
+
+	/**
+	 * The feature id for the '<em><b>Statemachines</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PACKAGE__STATEMACHINES = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Package</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PACKAGE_FEATURE_COUNT = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT = OSBPTypesPackage.LPACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Package</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PACKAGE_OPERATION_COUNT = OSBPTypesPackage.LPACKAGE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl <em>Statemachine</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachine()
+	 * @generated
+	 */
+	int STATEMACHINE = 4;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__NAME = STATEMACHINE_BASE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__DESCRIPTION = STATEMACHINE_BASE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Description Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__DESCRIPTION_VALUE = STATEMACHINE_BASE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Function Group</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__FUNCTION_GROUP = STATEMACHINE_BASE_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Initial Event</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__INITIAL_EVENT = STATEMACHINE_BASE_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Initial State</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__INITIAL_STATE = STATEMACHINE_BASE_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Events</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__EVENTS = STATEMACHINE_BASE_FEATURE_COUNT + 5;
+
+	/**
+	 * The feature id for the '<em><b>Controls</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__CONTROLS = STATEMACHINE_BASE_FEATURE_COUNT + 6;
+
+	/**
+	 * The feature id for the '<em><b>States</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__STATES = STATEMACHINE_BASE_FEATURE_COUNT + 7;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FEATURE_COUNT = STATEMACHINE_BASE_FEATURE_COUNT + 8;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION_COUNT = STATEMACHINE_BASE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControl <em>Statemachine Control</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControl()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL = 5;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL__NAME = STATEMACHINE_BASE__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FEATURE_COUNT = STATEMACHINE_BASE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_OPERATION_COUNT = STATEMACHINE_BASE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonImpl <em>Statemachine Control Button</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButton()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_BUTTON = 6;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON__NAME = STATEMACHINE_CONTROL__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Event Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON__EVENT_TYPE = STATEMACHINE_CONTROL_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Buttons</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON__BUTTONS = STATEMACHINE_CONTROL_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Button</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_FEATURE_COUNT = STATEMACHINE_CONTROL_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Button</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_OPERATION_COUNT = STATEMACHINE_CONTROL_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldImpl <em>Statemachine Control Field</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlField()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_FIELD = 7;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD__NAME = STATEMACHINE_CONTROL__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Fields</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD__FIELDS = STATEMACHINE_CONTROL_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Layouts</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD__LAYOUTS = STATEMACHINE_CONTROL_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Field</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_FEATURE_COUNT = STATEMACHINE_CONTROL_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Field</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_OPERATION_COUNT = STATEMACHINE_CONTROL_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOImpl <em>Statemachine Control DTO</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlDTO()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_DTO = 8;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO__NAME = STATEMACHINE_CONTROL__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Dtos</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO__DTOS = STATEMACHINE_CONTROL_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control DTO</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_FEATURE_COUNT = STATEMACHINE_CONTROL_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control DTO</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_OPERATION_COUNT = STATEMACHINE_CONTROL_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerImpl <em>Statemachine Control Scheduler</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlScheduler()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER = 9;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER__NAME = STATEMACHINE_CONTROL__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Schedulers</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS = STATEMACHINE_CONTROL_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Scheduler</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_FEATURE_COUNT = STATEMACHINE_CONTROL_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Scheduler</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_OPERATION_COUNT = STATEMACHINE_CONTROL_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlPeripheralImpl <em>Statemachine Control Peripheral</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlPeripheralImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlPeripheral()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL = 10;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL__NAME = STATEMACHINE_CONTROL__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Line Displays</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS = STATEMACHINE_CONTROL_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Pos Printers</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS = STATEMACHINE_CONTROL_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Cash Drawers</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS = STATEMACHINE_CONTROL_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Payment Terminals</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS = STATEMACHINE_CONTROL_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Peripheral</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL_FEATURE_COUNT = STATEMACHINE_CONTROL_FEATURE_COUNT + 4;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Peripheral</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_PERIPHERAL_OPERATION_COUNT = STATEMACHINE_CONTROL_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility <em>Statemachine Control Visibility</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlVisibility()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_VISIBILITY = 16;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_VISIBILITY__NAME = STATEMACHINE_BASE__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Visibility</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_VISIBILITY_FEATURE_COUNT = STATEMACHINE_BASE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_VISIBILITY___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Visibility</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_VISIBILITY_OPERATION_COUNT = STATEMACHINE_BASE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeImpl <em>Statemachine Control Button Attribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttribute()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE = 11;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__NAME = STATEMACHINE_CONTROL_VISIBILITY__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Has Image</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__HAS_IMAGE = STATEMACHINE_CONTROL_VISIBILITY_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Image</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__IMAGE = STATEMACHINE_CONTROL_VISIBILITY_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Event</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT = STATEMACHINE_CONTROL_VISIBILITY_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Button Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_FEATURE_COUNT = STATEMACHINE_CONTROL_VISIBILITY_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL_VISIBILITY___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Button Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_OPERATION_COUNT = STATEMACHINE_CONTROL_VISIBILITY_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent <em>Statemachine Control Button Attribute Event</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttributeEvent()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT = 12;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Button Attribute Event</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_FEATURE_COUNT = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Button Attribute Event</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_OPERATION_COUNT = STATEMACHINE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventKeyboardImpl <em>Statemachine Control Button Attribute Event Keyboard</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventKeyboardImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttributeEventKeyboard()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD = 13;
+
+	/**
+	 * The feature id for the '<em><b>Keystroke</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Button Attribute Event Keyboard</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD_FEATURE_COUNT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Button Attribute Event Keyboard</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD_OPERATION_COUNT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventIdentityImpl <em>Statemachine Control Button Attribute Event Identity</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventIdentityImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttributeEventIdentity()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY = 14;
+
+	/**
+	 * The feature id for the '<em><b>Identity</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Button Attribute Event Identity</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY_FEATURE_COUNT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Button Attribute Event Identity</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY_OPERATION_COUNT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventEventImpl <em>Statemachine Control Button Attribute Event Event</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventEventImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttributeEventEvent()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT = 15;
+
+	/**
+	 * The feature id for the '<em><b>Event</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Button Attribute Event Event</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT_FEATURE_COUNT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Button Attribute Event Event</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT_OPERATION_COUNT = STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldAttributeImpl <em>Statemachine Control Field Attribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldAttributeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlFieldAttribute()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_FIELD_ATTRIBUTE = 17;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__NAME = STATEMACHINE_CONTROL_VISIBILITY__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Attribute Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE = STATEMACHINE_CONTROL_VISIBILITY_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Field Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_ATTRIBUTE_FEATURE_COUNT = STATEMACHINE_CONTROL_VISIBILITY_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL_VISIBILITY___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Field Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_ATTRIBUTE_OPERATION_COUNT = STATEMACHINE_CONTROL_VISIBILITY_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldLayoutImpl <em>Statemachine Control Field Layout</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldLayoutImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlFieldLayout()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_FIELD_LAYOUT = 18;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_LAYOUT__NAME = STATEMACHINE_CONTROL_VISIBILITY__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Field Layout</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_LAYOUT_FEATURE_COUNT = STATEMACHINE_CONTROL_VISIBILITY_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_LAYOUT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_CONTROL_VISIBILITY___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Field Layout</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_FIELD_LAYOUT_OPERATION_COUNT = STATEMACHINE_CONTROL_VISIBILITY_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOAttributeImpl <em>Statemachine Control DTO Attribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOAttributeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlDTOAttribute()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_DTO_ATTRIBUTE = 19;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_ATTRIBUTE__NAME = STATEMACHINE_BASE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Attribute Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE = STATEMACHINE_BASE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Has Event</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_ATTRIBUTE__HAS_EVENT = STATEMACHINE_BASE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Event</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT = STATEMACHINE_BASE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control DTO Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_ATTRIBUTE_FEATURE_COUNT = STATEMACHINE_BASE_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control DTO Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_DTO_ATTRIBUTE_OPERATION_COUNT = STATEMACHINE_BASE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice <em>Statemachine Peripheral Device</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDevice()
+	 * @generated
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE = 20;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE__NAME = STATEMACHINE_BASE__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Peripheral Device</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_FEATURE_COUNT = STATEMACHINE_BASE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Peripheral Device</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_OPERATION_COUNT = STATEMACHINE_BASE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDeviceLineDisplayImpl <em>Statemachine Peripheral Device Line Display</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDeviceLineDisplayImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDeviceLineDisplay()
+	 * @generated
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY = 21;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY__NAME = STATEMACHINE_PERIPHERAL_DEVICE__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Peripheral Device Line Display</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY_FEATURE_COUNT = STATEMACHINE_PERIPHERAL_DEVICE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_PERIPHERAL_DEVICE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Peripheral Device Line Display</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY_OPERATION_COUNT = STATEMACHINE_PERIPHERAL_DEVICE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDevicePOSPrinterImpl <em>Statemachine Peripheral Device POS Printer</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDevicePOSPrinterImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDevicePOSPrinter()
+	 * @generated
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER = 22;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER__NAME = STATEMACHINE_PERIPHERAL_DEVICE__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Peripheral Device POS Printer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER_FEATURE_COUNT = STATEMACHINE_PERIPHERAL_DEVICE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_PERIPHERAL_DEVICE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Peripheral Device POS Printer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER_OPERATION_COUNT = STATEMACHINE_PERIPHERAL_DEVICE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDeviceCashDrawerImpl <em>Statemachine Peripheral Device Cash Drawer</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDeviceCashDrawerImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDeviceCashDrawer()
+	 * @generated
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER = 23;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER__NAME = STATEMACHINE_PERIPHERAL_DEVICE__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Peripheral Device Cash Drawer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER_FEATURE_COUNT = STATEMACHINE_PERIPHERAL_DEVICE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_PERIPHERAL_DEVICE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Peripheral Device Cash Drawer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER_OPERATION_COUNT = STATEMACHINE_PERIPHERAL_DEVICE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDevicePTImpl <em>Statemachine Peripheral Device PT</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDevicePTImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDevicePT()
+	 * @generated
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_PT = 24;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_PT__NAME = STATEMACHINE_PERIPHERAL_DEVICE__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Peripheral Device PT</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_PT_FEATURE_COUNT = STATEMACHINE_PERIPHERAL_DEVICE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_PT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_PERIPHERAL_DEVICE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Peripheral Device PT</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_PERIPHERAL_DEVICE_PT_OPERATION_COUNT = STATEMACHINE_PERIPHERAL_DEVICE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerAttributeImpl <em>Statemachine Control Scheduler Attribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerAttributeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlSchedulerAttribute()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE = 25;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__NAME = STATEMACHINE_BASE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Delay</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY = STATEMACHINE_BASE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Event</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT = STATEMACHINE_BASE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Control Scheduler Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE_FEATURE_COUNT = STATEMACHINE_BASE_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Control Scheduler Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE_OPERATION_COUNT = STATEMACHINE_BASE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineEventImpl <em>Statemachine Event</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineEventImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineEvent()
+	 * @generated
+	 */
+	int STATEMACHINE_EVENT = 26;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_EVENT__NAME = STATEMACHINE_BASE__NAME;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Event</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_EVENT_FEATURE_COUNT = STATEMACHINE_BASE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_EVENT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Event</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_EVENT_OPERATION_COUNT = STATEMACHINE_BASE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl <em>Statemachine State</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineState()
+	 * @generated
+	 */
+	int STATEMACHINE_STATE = 27;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE__NAME = STATEMACHINE_BASE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Triggers</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE__TRIGGERS = STATEMACHINE_BASE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Identity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE__IDENTITY = STATEMACHINE_BASE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Keystroke</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE__KEYSTROKE = STATEMACHINE_BASE_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Has Key Operation</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE__HAS_KEY_OPERATION = STATEMACHINE_BASE_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Key Operation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE__KEY_OPERATION = STATEMACHINE_BASE_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine State</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE_FEATURE_COUNT = STATEMACHINE_BASE_FEATURE_COUNT + 5;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_BASE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine State</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STATE_OPERATION_COUNT = STATEMACHINE_BASE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl <em>Statemachine Trigger</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineTrigger()
+	 * @generated
+	 */
+	int STATEMACHINE_TRIGGER = 28;
+
+	/**
+	 * The feature id for the '<em><b>Has Transition</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_TRIGGER__HAS_TRANSITION = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Transition</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_TRIGGER__TRANSITION = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Triggers</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_TRIGGER__TRIGGERS = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Guards</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_TRIGGER__GUARDS = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Actions</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_TRIGGER__ACTIONS = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Trigger</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_TRIGGER_FEATURE_COUNT = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 5;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_TRIGGER___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Trigger</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_TRIGGER_OPERATION_COUNT = STATEMACHINE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineAction <em>Statemachine Action</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineAction
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineAction()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION = 29;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FEATURE_COUNT = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_OPERATION_COUNT = STATEMACHINE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralBlinkRateImpl <em>Statemachine Action Peripheral Blink Rate</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralBlinkRateImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralBlinkRate()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE = 30;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Blink Rate</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Blink Rate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Blink Rate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralClearImpl <em>Statemachine Action Peripheral Clear</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralClearImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralClear()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CLEAR = 31;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Clear</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CLEAR_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CLEAR___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Clear</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CLEAR_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl <em>Statemachine Action Peripheral Create Window</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralCreateWindow()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW = 32;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Viewport Row</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Viewport Column</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Viewport Height</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Viewport Width</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH = STATEMACHINE_ACTION_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Window Height</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT = STATEMACHINE_ACTION_FEATURE_COUNT + 5;
+
+	/**
+	 * The feature id for the '<em><b>Window Width</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH = STATEMACHINE_ACTION_FEATURE_COUNT + 6;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Create Window</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 7;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Create Window</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCursorTypeImpl <em>Statemachine Action Peripheral Cursor Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCursorTypeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralCursorType()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE = 33;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Cursor Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Cursor Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Cursor Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDestroyWindowImpl <em>Statemachine Action Peripheral Destroy Window</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDestroyWindowImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDestroyWindow()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW = 34;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Destroy Window</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Destroy Window</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDeviceBrightnessImpl <em>Statemachine Action Peripheral Device Brightness</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDeviceBrightnessImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDeviceBrightness()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS = 35;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Brightness</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Device Brightness</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Device Brightness</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayBitmapImpl <em>Statemachine Action Peripheral Display Bitmap</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayBitmapImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDisplayBitmap()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP = 36;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Bitmap Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Display Bitmap</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Display Bitmap</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextImpl <em>Statemachine Action Peripheral Display Text</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDisplayText()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT = 37;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Has Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__HAS_TYPE = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Text Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT_TYPE = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Display Text</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 4;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Display Text</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl <em>Statemachine Action Peripheral Display Text At</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDisplayTextAt()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT = 38;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Row</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__ROW = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Column</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__COLUMN = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Has Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__HAS_TYPE = STATEMACHINE_ACTION_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Text Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT_TYPE = STATEMACHINE_ACTION_FEATURE_COUNT + 5;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Display Text At</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 6;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Display Text At</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralInterCharacterWaitImpl <em>Statemachine Action Peripheral Inter Character Wait</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralInterCharacterWaitImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralInterCharacterWait()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT = 39;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Wait</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Inter Character Wait</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Inter Character Wait</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeFormatImpl <em>Statemachine Action Peripheral Marquee Format</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeFormatImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralMarqueeFormat()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT = 40;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Format</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Marquee Format</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Marquee Format</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeRepeatWaitImpl <em>Statemachine Action Peripheral Marquee Repeat Wait</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeRepeatWaitImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralMarqueeRepeatWait()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT = 41;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Wait</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Marquee Repeat Wait</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Marquee Repeat Wait</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeTypeImpl <em>Statemachine Action Peripheral Marquee Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeTypeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralMarqueeType()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE = 42;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Marquee Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Marquee Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Marquee Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeUnitWaitImpl <em>Statemachine Action Peripheral Marquee Unit Wait</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeUnitWaitImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralMarqueeUnitWait()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT = 43;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Wait</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Marquee Unit Wait</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Marquee Unit Wait</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralScrollImpl <em>Statemachine Action Peripheral Scroll</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralScrollImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralScroll()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_SCROLL = 44;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Direction</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Units</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Scroll</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_SCROLL_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_SCROLL___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Scroll</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_SCROLL_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralOpenDrawerImpl <em>Statemachine Action Peripheral Open Drawer</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralOpenDrawerImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralOpenDrawer()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER = 45;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Open Drawer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Open Drawer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBarcodeImpl <em>Statemachine Action Peripheral Print Barcode</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBarcodeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintBarcode()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE = 46;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Data</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Barcode Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Print Barcode</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Print Barcode</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBitmapImpl <em>Statemachine Action Peripheral Print Bitmap</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBitmapImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintBitmap()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP = 47;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Bitmap Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Print Bitmap</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Print Bitmap</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintCutImpl <em>Statemachine Action Peripheral Print Cut</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintCutImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintCut()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT = 48;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Print Cut</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Print Cut</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintRegisterBitmapImpl <em>Statemachine Action Peripheral Print Register Bitmap</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintRegisterBitmapImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintRegisterBitmap()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP = 49;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Bitmap Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Print Register Bitmap</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Print Register Bitmap</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintNormalImpl <em>Statemachine Action Peripheral Print Normal</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintNormalImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintNormal()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL = 50;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Barcode Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__BARCODE_TYPE = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Print Normal</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Print Normal</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTOpenImpl <em>Statemachine Action Peripheral PT Open</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTOpenImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTOpen()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN = 51;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Host</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral PT Open</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral PT Open</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTCloseImpl <em>Statemachine Action Peripheral PT Close</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTCloseImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTClose()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE = 52;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral PT Close</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral PT Close</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTReversalImpl <em>Statemachine Action Peripheral PT Reversal</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTReversalImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTReversal()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL = 53;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Password</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Receipt</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral PT Reversal</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral PT Reversal</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAcknowledgeImpl <em>Statemachine Action Peripheral PT Acknowledge</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAcknowledgeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTAcknowledge()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE = 54;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral PT Acknowledge</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral PT Acknowledge</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTRegistrationImpl <em>Statemachine Action Peripheral PT Registration</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTRegistrationImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTRegistration()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION = 55;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Password</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Configuration</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral PT Registration</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral PT Registration</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAuthorizationImpl <em>Statemachine Action Peripheral PT Authorization</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAuthorizationImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTAuthorization()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION = 56;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Amount</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral PT Authorization</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral PT Authorization</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource <em>Statemachine Action Field Source</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSource()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE = 59;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Source</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Source</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTResponseImpl <em>Statemachine Action Peripheral PT Response</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTResponseImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTResponse()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE = 57;
+
+	/**
+	 * The feature id for the '<em><b>Device</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral PT Response</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral PT Response</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintReportImpl <em>Statemachine Action Peripheral Print Report</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintReportImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintReport()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT = 58;
+
+	/**
+	 * The feature id for the '<em><b>Report</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Key</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Has Filter</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__HAS_FILTER = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Peripheral Print Report</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Peripheral Print Report</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceStringImpl <em>Statemachine Action Field Source String</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceStringImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceString()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_STRING = 60;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Source String</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_STRING_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_STRING___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Source String</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_STRING_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceNumberImpl <em>Statemachine Action Field Source Number</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceNumberImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceNumber()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER = 61;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Source Number</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Source Number</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEvaluateImpl <em>Statemachine Action Field Source Evaluate</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEvaluateImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceEvaluate()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE = 62;
+
+	/**
+	 * The feature id for the '<em><b>Evaluationtype</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Source Evaluate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Source Evaluate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceTranslateImpl <em>Statemachine Action Field Source Translate</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceTranslateImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceTranslate()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE = 63;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Source Translate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Source Translate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceDtoAttributeImpl <em>Statemachine Action Field Source Dto Attribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceDtoAttributeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceDtoAttribute()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE = 64;
+
+	/**
+	 * The feature id for the '<em><b>Dto</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Source Dto Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Source Dto Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEventImpl <em>Statemachine Action Field Source Event</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEventImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceEvent()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVENT = 65;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Source Event</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVENT_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVENT___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Source Event</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SOURCE_EVENT_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionConditionalTransitionImpl <em>Statemachine Action Conditional Transition</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionConditionalTransitionImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionConditionalTransition()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_CONDITIONAL_TRANSITION = 66;
+
+	/**
+	 * The feature id for the '<em><b>Transition</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Guard</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Actions</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Conditional Transition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_CONDITIONAL_TRANSITION_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_CONDITIONAL_TRANSITION___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Conditional Transition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_CONDITIONAL_TRANSITION_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationParameterImpl <em>Statemachine Operation Parameter</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationParameterImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineOperationParameter()
+	 * @generated
+	 */
+	int STATEMACHINE_OPERATION_PARAMETER = 67;
+
+	/**
+	 * The feature id for the '<em><b>Source</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION_PARAMETER__SOURCE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Operation Parameter</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION_PARAMETER_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION_PARAMETER___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Operation Parameter</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION_PARAMETER_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationImpl <em>Statemachine Operation</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineOperation()
+	 * @generated
+	 */
+	int STATEMACHINE_OPERATION = 68;
+
+	/**
+	 * The feature id for the '<em><b>Operation</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION__OPERATION = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>First</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION__FIRST = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>More</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION__MORE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Operation</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Operation</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl <em>Statemachine Guard</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineGuard()
+	 * @generated
+	 */
+	int STATEMACHINE_GUARD = 69;
+
+	/**
+	 * The feature id for the '<em><b>Guard</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_GUARD__GUARD = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Has On Fail</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_GUARD__HAS_ON_FAIL = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>On Fail Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_GUARD__ON_FAIL_DESCRIPTION = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>On Fail Caption</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_GUARD__ON_FAIL_CAPTION = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>On Fail Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_GUARD__ON_FAIL_TYPE = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Guard</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_GUARD_FEATURE_COUNT = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 5;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_GUARD___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Guard</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_GUARD_OPERATION_COUNT = STATEMACHINE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineFunctionImpl <em>Statemachine Function</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineFunctionImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineFunction()
+	 * @generated
+	 */
+	int STATEMACHINE_FUNCTION = 70;
+
+	/**
+	 * The feature id for the '<em><b>Function</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FUNCTION__FUNCTION = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>First</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FUNCTION__FIRST = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>More</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FUNCTION__MORE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Function</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FUNCTION_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FUNCTION___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Function</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FUNCTION_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageRetrieveImpl <em>Statemachine Storage Retrieve</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageRetrieveImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineStorageRetrieve()
+	 * @generated
+	 */
+	int STATEMACHINE_STORAGE_RETRIEVE = 71;
+
+	/**
+	 * The feature id for the '<em><b>Key</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE_RETRIEVE__KEY = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Storage Retrieve</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE_RETRIEVE_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE_RETRIEVE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Storage Retrieve</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE_RETRIEVE_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageImpl <em>Statemachine Storage</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineStorage()
+	 * @generated
+	 */
+	int STATEMACHINE_STORAGE = 72;
+
+	/**
+	 * The feature id for the '<em><b>Key</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE__KEY = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Content</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE__CONTENT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Storage</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Storage</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_STORAGE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldConcatenationImpl <em>Statemachine Action Field Concatenation</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldConcatenationImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldConcatenation()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_CONCATENATION = 73;
+
+	/**
+	 * The feature id for the '<em><b>First</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>More</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Concatenation</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CONCATENATION_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CONCATENATION___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Concatenation</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CONCATENATION_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSetImpl <em>Statemachine Action Field Set</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSetImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSet()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_SET = 74;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Source</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SET__SOURCE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Set</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SET_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SET___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Set</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_SET_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldKeystrokeImpl <em>Statemachine Action Field Keystroke</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldKeystrokeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldKeystroke()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_KEYSTROKE = 75;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Keystroke</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_KEYSTROKE__KEYSTROKE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Keystroke</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_KEYSTROKE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_KEYSTROKE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Keystroke</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_KEYSTROKE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldClearImpl <em>Statemachine Action Field Clear</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldClearImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldClear()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_CLEAR = 76;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Clear</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CLEAR_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CLEAR___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Clear</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_CLEAR_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldGetImpl <em>Statemachine Action Field Get</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldGetImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldGet()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_GET = 77;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Get</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_GET_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_GET___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Get</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_GET_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldRemoveImpl <em>Statemachine Action Field Remove</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldRemoveImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldRemove()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_FIELD_REMOVE = 78;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Field Remove</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_REMOVE_FEATURE_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_REMOVE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION_FIELD_SOURCE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Field Remove</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_FIELD_REMOVE_OPERATION_COUNT = STATEMACHINE_ACTION_FIELD_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemVisibleImpl <em>Statemachine Action Item Visible</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemVisibleImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionItemVisible()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_ITEM_VISIBLE = 79;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Item Visible</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_ITEM_VISIBLE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_ITEM_VISIBLE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Item Visible</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_ITEM_VISIBLE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemInvisibleImpl <em>Statemachine Action Item Invisible</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemInvisibleImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionItemInvisible()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_ITEM_INVISIBLE = 80;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Item Invisible</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_ITEM_INVISIBLE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_ITEM_INVISIBLE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Item Invisible</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_ITEM_INVISIBLE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonCaptionImpl <em>Statemachine Action Button Caption</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonCaptionImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionButtonCaption()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_BUTTON_CAPTION = 81;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Caption</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Button Caption</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_CAPTION_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_CAPTION___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Button Caption</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_CAPTION_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonImageImpl <em>Statemachine Action Button Image</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonImageImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionButtonImage()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_BUTTON_IMAGE = 82;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Image</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Button Image</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_IMAGE_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_IMAGE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Button Image</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_BUTTON_IMAGE_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionDTOFindImpl <em>Statemachine Action DTO Find</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionDTOFindImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionDTOFind()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_DTO_FIND = 83;
+
+	/**
+	 * The feature id for the '<em><b>Dto</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_DTO_FIND__DTO = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Search</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_DTO_FIND__SEARCH = STATEMACHINE_ACTION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action DTO Find</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_DTO_FIND_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_DTO_FIND___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action DTO Find</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_DTO_FIND_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionSchedulerImpl <em>Statemachine Action Scheduler</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionSchedulerImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionScheduler()
+	 * @generated
+	 */
+	int STATEMACHINE_ACTION_SCHEDULER = 84;
+
+	/**
+	 * The feature id for the '<em><b>Scheduler</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_SCHEDULER__SCHEDULER = STATEMACHINE_ACTION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Action Scheduler</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_SCHEDULER_FEATURE_COUNT = STATEMACHINE_ACTION_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_SCHEDULER___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_ACTION___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Action Scheduler</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_ACTION_SCHEDULER_OPERATION_COUNT = STATEMACHINE_ACTION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineDTOTypeImpl <em>Statemachine DTO Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDTOTypeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineDTOType()
+	 * @generated
+	 */
+	int STATEMACHINE_DTO_TYPE = 85;
+
+	/**
+	 * The feature id for the '<em><b>Attribute Type</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine DTO Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_DTO_TYPE_FEATURE_COUNT = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_DTO_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine DTO Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_DTO_TYPE_OPERATION_COUNT = STATEMACHINE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineFieldTypeImpl <em>Statemachine Field Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineFieldTypeImpl
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineFieldType()
+	 * @generated
+	 */
+	int STATEMACHINE_FIELD_TYPE = 86;
+
+	/**
+	 * The feature id for the '<em><b>Attribute Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine Field Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FIELD_TYPE_FEATURE_COUNT = STATEMACHINE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FIELD_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Statemachine Field Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FIELD_TYPE_OPERATION_COUNT = STATEMACHINE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineInternalType <em>Statemachine Internal Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineInternalType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineInternalType()
+	 * @generated
+	 */
+	int STATEMACHINE_INTERNAL_TYPE = 87;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType <em>Statemachine Control Button Event Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonEventType()
+	 * @generated
+	 */
+	int STATEMACHINE_CONTROL_BUTTON_EVENT_TYPE = 88;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType <em>Statemachine Evaluation Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineEvaluationType()
+	 * @generated
+	 */
+	int STATEMACHINE_EVALUATION_TYPE = 89;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType <em>Statemachine User Message Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineUserMessageType()
+	 * @generated
+	 */
+	int STATEMACHINE_USER_MESSAGE_TYPE = 90;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType <em>Statemachine Line Display Cursor Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayCursorType()
+	 * @generated
+	 */
+	int STATEMACHINE_LINE_DISPLAY_CURSOR_TYPE = 91;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType <em>Statemachine Line Display Marquee Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayMarqueeType()
+	 * @generated
+	 */
+	int STATEMACHINE_LINE_DISPLAY_MARQUEE_TYPE = 92;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat <em>Statemachine Line Display Marquee Format</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayMarqueeFormat()
+	 * @generated
+	 */
+	int STATEMACHINE_LINE_DISPLAY_MARQUEE_FORMAT = 93;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType <em>Statemachine Line Display Text Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayTextType()
+	 * @generated
+	 */
+	int STATEMACHINE_LINE_DISPLAY_TEXT_TYPE = 94;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType <em>Statemachine Line Display Scroll Text Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayScrollTextType()
+	 * @generated
+	 */
+	int STATEMACHINE_LINE_DISPLAY_SCROLL_TEXT_TYPE = 95;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType <em>Statemachine POS Printer Barcode Type</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePOSPrinterBarcodeType()
+	 * @generated
+	 */
+	int STATEMACHINE_POS_PRINTER_BARCODE_TYPE = 96;
+
+	/**
+	 * The meta object id for the '<em>Internal EObject</em>' data type.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.InternalEObject
+	 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getInternalEObject()
+	 * @generated
+	 */
+	int INTERNAL_EOBJECT = 97;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineModel <em>Statemachine Model</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Model</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineModel
+	 * @generated
+	 */
+	EClass getStatemachineModel();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineModel#getPackages <em>Packages</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Packages</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineModel#getPackages()
+	 * @see #getStatemachineModel()
+	 * @generated
+	 */
+	EReference getStatemachineModel_Packages();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLazyResolver <em>Statemachine Lazy Resolver</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Lazy Resolver</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLazyResolver
+	 * @generated
+	 */
+	EClass getStatemachineLazyResolver();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject) <em>EResolve Proxy</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>EResolve Proxy</em>' operation.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject)
+	 * @generated
+	 */
+	EOperation getStatemachineLazyResolver__EResolveProxy__InternalEObject();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineBase <em>Statemachine Base</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Base</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineBase
+	 * @generated
+	 */
+	EClass getStatemachineBase();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineBase#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineBase#getName()
+	 * @see #getStatemachineBase()
+	 * @generated
+	 */
+	EAttribute getStatemachineBase_Name();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePackage <em>Statemachine Package</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Package</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePackage
+	 * @generated
+	 */
+	EClass getStatemachinePackage();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePackage#getStatemachines <em>Statemachines</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Statemachines</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePackage#getStatemachines()
+	 * @see #getStatemachinePackage()
+	 * @generated
+	 */
+	EReference getStatemachinePackage_Statemachines();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.Statemachine <em>Statemachine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine
+	 * @generated
+	 */
+	EClass getStatemachine();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#isDescription <em>Description</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Description</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine#isDescription()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EAttribute getStatemachine_Description();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getDescriptionValue <em>Description Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Description Value</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine#getDescriptionValue()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EAttribute getStatemachine_DescriptionValue();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getFunctionGroup <em>Function Group</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Function Group</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine#getFunctionGroup()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EReference getStatemachine_FunctionGroup();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getInitialEvent <em>Initial Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Initial Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine#getInitialEvent()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EReference getStatemachine_InitialEvent();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getInitialState <em>Initial State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Initial State</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine#getInitialState()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EReference getStatemachine_InitialState();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getEvents <em>Events</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Events</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine#getEvents()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EReference getStatemachine_Events();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getControls <em>Controls</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Controls</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine#getControls()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EReference getStatemachine_Controls();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.Statemachine#getStates <em>States</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>States</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine#getStates()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EReference getStatemachine_States();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControl <em>Statemachine Control</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControl
+	 * @generated
+	 */
+	EClass getStatemachineControl();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButton <em>Statemachine Control Button</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Button</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButton
+	 * @generated
+	 */
+	EClass getStatemachineControlButton();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButton#getEventType <em>Event Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Event Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButton#getEventType()
+	 * @see #getStatemachineControlButton()
+	 * @generated
+	 */
+	EAttribute getStatemachineControlButton_EventType();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButton#getButtons <em>Buttons</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Buttons</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButton#getButtons()
+	 * @see #getStatemachineControlButton()
+	 * @generated
+	 */
+	EReference getStatemachineControlButton_Buttons();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlField <em>Statemachine Control Field</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Field</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlField
+	 * @generated
+	 */
+	EClass getStatemachineControlField();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlField#getFields <em>Fields</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Fields</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlField#getFields()
+	 * @see #getStatemachineControlField()
+	 * @generated
+	 */
+	EReference getStatemachineControlField_Fields();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlField#getLayouts <em>Layouts</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Layouts</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlField#getLayouts()
+	 * @see #getStatemachineControlField()
+	 * @generated
+	 */
+	EReference getStatemachineControlField_Layouts();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO <em>Statemachine Control DTO</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control DTO</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO
+	 * @generated
+	 */
+	EClass getStatemachineControlDTO();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO#getDtos <em>Dtos</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Dtos</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO#getDtos()
+	 * @see #getStatemachineControlDTO()
+	 * @generated
+	 */
+	EReference getStatemachineControlDTO_Dtos();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler <em>Statemachine Control Scheduler</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Scheduler</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler
+	 * @generated
+	 */
+	EClass getStatemachineControlScheduler();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler#getSchedulers <em>Schedulers</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Schedulers</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler#getSchedulers()
+	 * @see #getStatemachineControlScheduler()
+	 * @generated
+	 */
+	EReference getStatemachineControlScheduler_Schedulers();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral <em>Statemachine Control Peripheral</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Peripheral</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral
+	 * @generated
+	 */
+	EClass getStatemachineControlPeripheral();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getLineDisplays <em>Line Displays</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Line Displays</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getLineDisplays()
+	 * @see #getStatemachineControlPeripheral()
+	 * @generated
+	 */
+	EReference getStatemachineControlPeripheral_LineDisplays();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getPosPrinters <em>Pos Printers</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Pos Printers</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getPosPrinters()
+	 * @see #getStatemachineControlPeripheral()
+	 * @generated
+	 */
+	EReference getStatemachineControlPeripheral_PosPrinters();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getCashDrawers <em>Cash Drawers</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Cash Drawers</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getCashDrawers()
+	 * @see #getStatemachineControlPeripheral()
+	 * @generated
+	 */
+	EReference getStatemachineControlPeripheral_CashDrawers();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getPaymentTerminals <em>Payment Terminals</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Payment Terminals</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral#getPaymentTerminals()
+	 * @see #getStatemachineControlPeripheral()
+	 * @generated
+	 */
+	EReference getStatemachineControlPeripheral_PaymentTerminals();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute <em>Statemachine Control Button Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Button Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute
+	 * @generated
+	 */
+	EClass getStatemachineControlButtonAttribute();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#isHasImage <em>Has Image</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Has Image</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#isHasImage()
+	 * @see #getStatemachineControlButtonAttribute()
+	 * @generated
+	 */
+	EAttribute getStatemachineControlButtonAttribute_HasImage();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#getImage <em>Image</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Image</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#getImage()
+	 * @see #getStatemachineControlButtonAttribute()
+	 * @generated
+	 */
+	EAttribute getStatemachineControlButtonAttribute_Image();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#getEvent <em>Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute#getEvent()
+	 * @see #getStatemachineControlButtonAttribute()
+	 * @generated
+	 */
+	EReference getStatemachineControlButtonAttribute_Event();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent <em>Statemachine Control Button Attribute Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Button Attribute Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent
+	 * @generated
+	 */
+	EClass getStatemachineControlButtonAttributeEvent();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard <em>Statemachine Control Button Attribute Event Keyboard</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Button Attribute Event Keyboard</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard
+	 * @generated
+	 */
+	EClass getStatemachineControlButtonAttributeEventKeyboard();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard#getKeystroke <em>Keystroke</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Keystroke</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard#getKeystroke()
+	 * @see #getStatemachineControlButtonAttributeEventKeyboard()
+	 * @generated
+	 */
+	EAttribute getStatemachineControlButtonAttributeEventKeyboard_Keystroke();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity <em>Statemachine Control Button Attribute Event Identity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Button Attribute Event Identity</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity
+	 * @generated
+	 */
+	EClass getStatemachineControlButtonAttributeEventIdentity();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity#getIdentity <em>Identity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Identity</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity#getIdentity()
+	 * @see #getStatemachineControlButtonAttributeEventIdentity()
+	 * @generated
+	 */
+	EAttribute getStatemachineControlButtonAttributeEventIdentity_Identity();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent <em>Statemachine Control Button Attribute Event Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Button Attribute Event Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent
+	 * @generated
+	 */
+	EClass getStatemachineControlButtonAttributeEventEvent();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent#getEvent <em>Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent#getEvent()
+	 * @see #getStatemachineControlButtonAttributeEventEvent()
+	 * @generated
+	 */
+	EReference getStatemachineControlButtonAttributeEventEvent_Event();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility <em>Statemachine Control Visibility</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Visibility</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility
+	 * @generated
+	 */
+	EClass getStatemachineControlVisibility();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute <em>Statemachine Control Field Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Field Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute
+	 * @generated
+	 */
+	EClass getStatemachineControlFieldAttribute();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute#getAttributeType <em>Attribute Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Attribute Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute#getAttributeType()
+	 * @see #getStatemachineControlFieldAttribute()
+	 * @generated
+	 */
+	EReference getStatemachineControlFieldAttribute_AttributeType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout <em>Statemachine Control Field Layout</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Field Layout</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout
+	 * @generated
+	 */
+	EClass getStatemachineControlFieldLayout();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute <em>Statemachine Control DTO Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control DTO Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute
+	 * @generated
+	 */
+	EClass getStatemachineControlDTOAttribute();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#getAttributeType <em>Attribute Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Attribute Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#getAttributeType()
+	 * @see #getStatemachineControlDTOAttribute()
+	 * @generated
+	 */
+	EReference getStatemachineControlDTOAttribute_AttributeType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#isHasEvent <em>Has Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Has Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#isHasEvent()
+	 * @see #getStatemachineControlDTOAttribute()
+	 * @generated
+	 */
+	EAttribute getStatemachineControlDTOAttribute_HasEvent();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#getEvent <em>Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute#getEvent()
+	 * @see #getStatemachineControlDTOAttribute()
+	 * @generated
+	 */
+	EReference getStatemachineControlDTOAttribute_Event();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice <em>Statemachine Peripheral Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Peripheral Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice
+	 * @generated
+	 */
+	EClass getStatemachinePeripheralDevice();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay <em>Statemachine Peripheral Device Line Display</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Peripheral Device Line Display</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay
+	 * @generated
+	 */
+	EClass getStatemachinePeripheralDeviceLineDisplay();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter <em>Statemachine Peripheral Device POS Printer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Peripheral Device POS Printer</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter
+	 * @generated
+	 */
+	EClass getStatemachinePeripheralDevicePOSPrinter();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer <em>Statemachine Peripheral Device Cash Drawer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Peripheral Device Cash Drawer</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer
+	 * @generated
+	 */
+	EClass getStatemachinePeripheralDeviceCashDrawer();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT <em>Statemachine Peripheral Device PT</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Peripheral Device PT</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT
+	 * @generated
+	 */
+	EClass getStatemachinePeripheralDevicePT();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute <em>Statemachine Control Scheduler Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Control Scheduler Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute
+	 * @generated
+	 */
+	EClass getStatemachineControlSchedulerAttribute();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute#getDelay <em>Delay</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Delay</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute#getDelay()
+	 * @see #getStatemachineControlSchedulerAttribute()
+	 * @generated
+	 */
+	EAttribute getStatemachineControlSchedulerAttribute_Delay();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute#getEvent <em>Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute#getEvent()
+	 * @see #getStatemachineControlSchedulerAttribute()
+	 * @generated
+	 */
+	EReference getStatemachineControlSchedulerAttribute_Event();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineEvent <em>Statemachine Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineEvent
+	 * @generated
+	 */
+	EClass getStatemachineEvent();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState <em>Statemachine State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine State</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineState
+	 * @generated
+	 */
+	EClass getStatemachineState();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getTriggers <em>Triggers</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Triggers</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineState#getTriggers()
+	 * @see #getStatemachineState()
+	 * @generated
+	 */
+	EReference getStatemachineState_Triggers();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getIdentity <em>Identity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Identity</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineState#getIdentity()
+	 * @see #getStatemachineState()
+	 * @generated
+	 */
+	EReference getStatemachineState_Identity();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getKeystroke <em>Keystroke</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Keystroke</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineState#getKeystroke()
+	 * @see #getStatemachineState()
+	 * @generated
+	 */
+	EReference getStatemachineState_Keystroke();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#isHasKeyOperation <em>Has Key Operation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Has Key Operation</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineState#isHasKeyOperation()
+	 * @see #getStatemachineState()
+	 * @generated
+	 */
+	EAttribute getStatemachineState_HasKeyOperation();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getKeyOperation <em>Key Operation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Key Operation</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineState#getKeyOperation()
+	 * @see #getStatemachineState()
+	 * @generated
+	 */
+	EReference getStatemachineState_KeyOperation();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger <em>Statemachine Trigger</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Trigger</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineTrigger
+	 * @generated
+	 */
+	EClass getStatemachineTrigger();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#isHasTransition <em>Has Transition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Has Transition</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#isHasTransition()
+	 * @see #getStatemachineTrigger()
+	 * @generated
+	 */
+	EAttribute getStatemachineTrigger_HasTransition();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getTransition <em>Transition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Transition</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getTransition()
+	 * @see #getStatemachineTrigger()
+	 * @generated
+	 */
+	EReference getStatemachineTrigger_Transition();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getTriggers <em>Triggers</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Triggers</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getTriggers()
+	 * @see #getStatemachineTrigger()
+	 * @generated
+	 */
+	EReference getStatemachineTrigger_Triggers();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getGuards <em>Guards</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Guards</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getGuards()
+	 * @see #getStatemachineTrigger()
+	 * @generated
+	 */
+	EReference getStatemachineTrigger_Guards();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getActions <em>Actions</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Actions</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getActions()
+	 * @see #getStatemachineTrigger()
+	 * @generated
+	 */
+	EReference getStatemachineTrigger_Actions();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineAction <em>Statemachine Action</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineAction
+	 * @generated
+	 */
+	EClass getStatemachineAction();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate <em>Statemachine Action Peripheral Blink Rate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Blink Rate</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralBlinkRate();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate#getDevice()
+	 * @see #getStatemachineActionPeripheralBlinkRate()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralBlinkRate_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate#getBlinkRate <em>Blink Rate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Blink Rate</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate#getBlinkRate()
+	 * @see #getStatemachineActionPeripheralBlinkRate()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralBlinkRate_BlinkRate();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear <em>Statemachine Action Peripheral Clear</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Clear</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralClear();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear#getDevice()
+	 * @see #getStatemachineActionPeripheralClear()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralClear_Device();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow <em>Statemachine Action Peripheral Create Window</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Create Window</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralCreateWindow();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getDevice()
+	 * @see #getStatemachineActionPeripheralCreateWindow()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralCreateWindow_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportRow <em>Viewport Row</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Viewport Row</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportRow()
+	 * @see #getStatemachineActionPeripheralCreateWindow()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralCreateWindow_ViewportRow();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportColumn <em>Viewport Column</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Viewport Column</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportColumn()
+	 * @see #getStatemachineActionPeripheralCreateWindow()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralCreateWindow_ViewportColumn();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportHeight <em>Viewport Height</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Viewport Height</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportHeight()
+	 * @see #getStatemachineActionPeripheralCreateWindow()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralCreateWindow_ViewportHeight();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportWidth <em>Viewport Width</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Viewport Width</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getViewportWidth()
+	 * @see #getStatemachineActionPeripheralCreateWindow()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralCreateWindow_ViewportWidth();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getWindowHeight <em>Window Height</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Window Height</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getWindowHeight()
+	 * @see #getStatemachineActionPeripheralCreateWindow()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralCreateWindow_WindowHeight();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getWindowWidth <em>Window Width</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Window Width</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow#getWindowWidth()
+	 * @see #getStatemachineActionPeripheralCreateWindow()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralCreateWindow_WindowWidth();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType <em>Statemachine Action Peripheral Cursor Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Cursor Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralCursorType();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType#getDevice()
+	 * @see #getStatemachineActionPeripheralCursorType()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralCursorType_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType#getCursorType <em>Cursor Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Cursor Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType#getCursorType()
+	 * @see #getStatemachineActionPeripheralCursorType()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralCursorType_CursorType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow <em>Statemachine Action Peripheral Destroy Window</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Destroy Window</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralDestroyWindow();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow#getDevice()
+	 * @see #getStatemachineActionPeripheralDestroyWindow()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralDestroyWindow_Device();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness <em>Statemachine Action Peripheral Device Brightness</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Device Brightness</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralDeviceBrightness();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness#getDevice()
+	 * @see #getStatemachineActionPeripheralDeviceBrightness()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralDeviceBrightness_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness#getBrightness <em>Brightness</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Brightness</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness#getBrightness()
+	 * @see #getStatemachineActionPeripheralDeviceBrightness()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralDeviceBrightness_Brightness();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap <em>Statemachine Action Peripheral Display Bitmap</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Display Bitmap</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralDisplayBitmap();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap#getDevice()
+	 * @see #getStatemachineActionPeripheralDisplayBitmap()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralDisplayBitmap_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap#getBitmapId <em>Bitmap Id</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Bitmap Id</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap#getBitmapId()
+	 * @see #getStatemachineActionPeripheralDisplayBitmap()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralDisplayBitmap_BitmapId();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText <em>Statemachine Action Peripheral Display Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Display Text</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralDisplayText();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getDevice()
+	 * @see #getStatemachineActionPeripheralDisplayText()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralDisplayText_Device();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getText <em>Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Text</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getText()
+	 * @see #getStatemachineActionPeripheralDisplayText()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralDisplayText_Text();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#isHasType <em>Has Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Has Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#isHasType()
+	 * @see #getStatemachineActionPeripheralDisplayText()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralDisplayText_HasType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getTextType <em>Text Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Text Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText#getTextType()
+	 * @see #getStatemachineActionPeripheralDisplayText()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralDisplayText_TextType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt <em>Statemachine Action Peripheral Display Text At</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Display Text At</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralDisplayTextAt();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getDevice()
+	 * @see #getStatemachineActionPeripheralDisplayTextAt()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralDisplayTextAt_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getRow <em>Row</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Row</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getRow()
+	 * @see #getStatemachineActionPeripheralDisplayTextAt()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralDisplayTextAt_Row();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getColumn <em>Column</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Column</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getColumn()
+	 * @see #getStatemachineActionPeripheralDisplayTextAt()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralDisplayTextAt_Column();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getText <em>Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Text</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getText()
+	 * @see #getStatemachineActionPeripheralDisplayTextAt()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralDisplayTextAt_Text();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#isHasType <em>Has Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Has Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#isHasType()
+	 * @see #getStatemachineActionPeripheralDisplayTextAt()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralDisplayTextAt_HasType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getTextType <em>Text Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Text Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt#getTextType()
+	 * @see #getStatemachineActionPeripheralDisplayTextAt()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralDisplayTextAt_TextType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait <em>Statemachine Action Peripheral Inter Character Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Inter Character Wait</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralInterCharacterWait();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait#getDevice()
+	 * @see #getStatemachineActionPeripheralInterCharacterWait()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralInterCharacterWait_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait#getWait <em>Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Wait</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait#getWait()
+	 * @see #getStatemachineActionPeripheralInterCharacterWait()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralInterCharacterWait_Wait();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat <em>Statemachine Action Peripheral Marquee Format</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Marquee Format</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralMarqueeFormat();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat#getDevice()
+	 * @see #getStatemachineActionPeripheralMarqueeFormat()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralMarqueeFormat_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat#getFormat <em>Format</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Format</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat#getFormat()
+	 * @see #getStatemachineActionPeripheralMarqueeFormat()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralMarqueeFormat_Format();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait <em>Statemachine Action Peripheral Marquee Repeat Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Marquee Repeat Wait</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralMarqueeRepeatWait();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait#getDevice()
+	 * @see #getStatemachineActionPeripheralMarqueeRepeatWait()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralMarqueeRepeatWait_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait#getWait <em>Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Wait</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait#getWait()
+	 * @see #getStatemachineActionPeripheralMarqueeRepeatWait()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralMarqueeRepeatWait_Wait();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType <em>Statemachine Action Peripheral Marquee Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Marquee Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralMarqueeType();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType#getDevice()
+	 * @see #getStatemachineActionPeripheralMarqueeType()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralMarqueeType_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType#getMarqueeType <em>Marquee Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Marquee Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType#getMarqueeType()
+	 * @see #getStatemachineActionPeripheralMarqueeType()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralMarqueeType_MarqueeType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait <em>Statemachine Action Peripheral Marquee Unit Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Marquee Unit Wait</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralMarqueeUnitWait();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait#getDevice()
+	 * @see #getStatemachineActionPeripheralMarqueeUnitWait()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralMarqueeUnitWait_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait#getWait <em>Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Wait</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait#getWait()
+	 * @see #getStatemachineActionPeripheralMarqueeUnitWait()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralMarqueeUnitWait_Wait();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll <em>Statemachine Action Peripheral Scroll</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Scroll</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralScroll();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getDevice()
+	 * @see #getStatemachineActionPeripheralScroll()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralScroll_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getDirection <em>Direction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Direction</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getDirection()
+	 * @see #getStatemachineActionPeripheralScroll()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralScroll_Direction();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getUnits <em>Units</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Units</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll#getUnits()
+	 * @see #getStatemachineActionPeripheralScroll()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralScroll_Units();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer <em>Statemachine Action Peripheral Open Drawer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Open Drawer</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralOpenDrawer();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer#getDevice()
+	 * @see #getStatemachineActionPeripheralOpenDrawer()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralOpenDrawer_Device();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode <em>Statemachine Action Peripheral Print Barcode</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Print Barcode</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPrintBarcode();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getDevice()
+	 * @see #getStatemachineActionPeripheralPrintBarcode()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintBarcode_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getData <em>Data</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Data</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getData()
+	 * @see #getStatemachineActionPeripheralPrintBarcode()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralPrintBarcode_Data();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getBarcodeType <em>Barcode Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Barcode Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode#getBarcodeType()
+	 * @see #getStatemachineActionPeripheralPrintBarcode()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralPrintBarcode_BarcodeType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap <em>Statemachine Action Peripheral Print Bitmap</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Print Bitmap</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPrintBitmap();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap#getDevice()
+	 * @see #getStatemachineActionPeripheralPrintBitmap()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintBitmap_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap#getBitmapId <em>Bitmap Id</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Bitmap Id</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap#getBitmapId()
+	 * @see #getStatemachineActionPeripheralPrintBitmap()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralPrintBitmap_BitmapId();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut <em>Statemachine Action Peripheral Print Cut</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Print Cut</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPrintCut();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut#getDevice()
+	 * @see #getStatemachineActionPeripheralPrintCut()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintCut_Device();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut#getText <em>Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Text</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut#getText()
+	 * @see #getStatemachineActionPeripheralPrintCut()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintCut_Text();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap <em>Statemachine Action Peripheral Print Register Bitmap</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Print Register Bitmap</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPrintRegisterBitmap();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getDevice()
+	 * @see #getStatemachineActionPeripheralPrintRegisterBitmap()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintRegisterBitmap_Device();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getBitmapId <em>Bitmap Id</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Bitmap Id</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getBitmapId()
+	 * @see #getStatemachineActionPeripheralPrintRegisterBitmap()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralPrintRegisterBitmap_BitmapId();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap#getName()
+	 * @see #getStatemachineActionPeripheralPrintRegisterBitmap()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralPrintRegisterBitmap_Name();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal <em>Statemachine Action Peripheral Print Normal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Print Normal</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPrintNormal();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getDevice()
+	 * @see #getStatemachineActionPeripheralPrintNormal()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintNormal_Device();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getText <em>Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Text</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getText()
+	 * @see #getStatemachineActionPeripheralPrintNormal()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintNormal_Text();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getBarcodeType <em>Barcode Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Barcode Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal#getBarcodeType()
+	 * @see #getStatemachineActionPeripheralPrintNormal()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralPrintNormal_BarcodeType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen <em>Statemachine Action Peripheral PT Open</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral PT Open</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPTOpen();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getDevice()
+	 * @see #getStatemachineActionPeripheralPTOpen()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTOpen_Device();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getHost <em>Host</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Host</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getHost()
+	 * @see #getStatemachineActionPeripheralPTOpen()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTOpen_Host();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getPort <em>Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Port</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen#getPort()
+	 * @see #getStatemachineActionPeripheralPTOpen()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTOpen_Port();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose <em>Statemachine Action Peripheral PT Close</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral PT Close</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPTClose();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose#getDevice()
+	 * @see #getStatemachineActionPeripheralPTClose()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTClose_Device();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal <em>Statemachine Action Peripheral PT Reversal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral PT Reversal</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPTReversal();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getDevice()
+	 * @see #getStatemachineActionPeripheralPTReversal()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTReversal_Device();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getPassword <em>Password</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Password</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getPassword()
+	 * @see #getStatemachineActionPeripheralPTReversal()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTReversal_Password();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getReceipt <em>Receipt</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Receipt</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal#getReceipt()
+	 * @see #getStatemachineActionPeripheralPTReversal()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTReversal_Receipt();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge <em>Statemachine Action Peripheral PT Acknowledge</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral PT Acknowledge</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPTAcknowledge();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge#getDevice()
+	 * @see #getStatemachineActionPeripheralPTAcknowledge()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTAcknowledge_Device();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration <em>Statemachine Action Peripheral PT Registration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral PT Registration</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPTRegistration();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getDevice()
+	 * @see #getStatemachineActionPeripheralPTRegistration()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTRegistration_Device();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getPassword <em>Password</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Password</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getPassword()
+	 * @see #getStatemachineActionPeripheralPTRegistration()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTRegistration_Password();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getConfiguration <em>Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Configuration</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration#getConfiguration()
+	 * @see #getStatemachineActionPeripheralPTRegistration()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralPTRegistration_Configuration();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization <em>Statemachine Action Peripheral PT Authorization</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral PT Authorization</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPTAuthorization();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization#getDevice()
+	 * @see #getStatemachineActionPeripheralPTAuthorization()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTAuthorization_Device();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization#getAmount <em>Amount</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Amount</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization#getAmount()
+	 * @see #getStatemachineActionPeripheralPTAuthorization()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTAuthorization_Amount();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse <em>Statemachine Action Peripheral PT Response</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral PT Response</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPTResponse();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse#getDevice <em>Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Device</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse#getDevice()
+	 * @see #getStatemachineActionPeripheralPTResponse()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPTResponse_Device();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport <em>Statemachine Action Peripheral Print Report</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Peripheral Print Report</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport
+	 * @generated
+	 */
+	EClass getStatemachineActionPeripheralPrintReport();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#getReport <em>Report</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Report</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#getReport()
+	 * @see #getStatemachineActionPeripheralPrintReport()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintReport_Report();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#getKey <em>Key</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Key</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#getKey()
+	 * @see #getStatemachineActionPeripheralPrintReport()
+	 * @generated
+	 */
+	EReference getStatemachineActionPeripheralPrintReport_Key();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#isHasFilter <em>Has Filter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Has Filter</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport#isHasFilter()
+	 * @see #getStatemachineActionPeripheralPrintReport()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionPeripheralPrintReport_HasFilter();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource <em>Statemachine Action Field Source</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Source</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldSource();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString <em>Statemachine Action Field Source String</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Source String</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldSourceString();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString#getText <em>Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Text</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString#getText()
+	 * @see #getStatemachineActionFieldSourceString()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionFieldSourceString_Text();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber <em>Statemachine Action Field Source Number</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Source Number</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldSourceNumber();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber#getValue()
+	 * @see #getStatemachineActionFieldSourceNumber()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionFieldSourceNumber_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate <em>Statemachine Action Field Source Evaluate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Source Evaluate</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldSourceEvaluate();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate#getEvaluationtype <em>Evaluationtype</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Evaluationtype</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate#getEvaluationtype()
+	 * @see #getStatemachineActionFieldSourceEvaluate()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionFieldSourceEvaluate_Evaluationtype();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate <em>Statemachine Action Field Source Translate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Source Translate</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldSourceTranslate();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate#getText <em>Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Text</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate#getText()
+	 * @see #getStatemachineActionFieldSourceTranslate()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionFieldSourceTranslate_Text();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute <em>Statemachine Action Field Source Dto Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Source Dto Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldSourceDtoAttribute();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute#getDto <em>Dto</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Dto</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute#getDto()
+	 * @see #getStatemachineActionFieldSourceDtoAttribute()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldSourceDtoAttribute_Dto();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute#getAttribute()
+	 * @see #getStatemachineActionFieldSourceDtoAttribute()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldSourceDtoAttribute_Attribute();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent <em>Statemachine Action Field Source Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Source Event</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldSourceEvent();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition <em>Statemachine Action Conditional Transition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Conditional Transition</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition
+	 * @generated
+	 */
+	EClass getStatemachineActionConditionalTransition();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getTransition <em>Transition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Transition</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getTransition()
+	 * @see #getStatemachineActionConditionalTransition()
+	 * @generated
+	 */
+	EReference getStatemachineActionConditionalTransition_Transition();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getGuard <em>Guard</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Guard</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getGuard()
+	 * @see #getStatemachineActionConditionalTransition()
+	 * @generated
+	 */
+	EReference getStatemachineActionConditionalTransition_Guard();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getActions <em>Actions</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Actions</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition#getActions()
+	 * @see #getStatemachineActionConditionalTransition()
+	 * @generated
+	 */
+	EReference getStatemachineActionConditionalTransition_Actions();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter <em>Statemachine Operation Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Operation Parameter</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter
+	 * @generated
+	 */
+	EClass getStatemachineOperationParameter();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter#getSource <em>Source</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Source</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter#getSource()
+	 * @see #getStatemachineOperationParameter()
+	 * @generated
+	 */
+	EReference getStatemachineOperationParameter_Source();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation <em>Statemachine Operation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Operation</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineOperation
+	 * @generated
+	 */
+	EClass getStatemachineOperation();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getOperation <em>Operation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Operation</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getOperation()
+	 * @see #getStatemachineOperation()
+	 * @generated
+	 */
+	EReference getStatemachineOperation_Operation();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getFirst <em>First</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>First</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getFirst()
+	 * @see #getStatemachineOperation()
+	 * @generated
+	 */
+	EReference getStatemachineOperation_First();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getMore <em>More</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>More</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getMore()
+	 * @see #getStatemachineOperation()
+	 * @generated
+	 */
+	EReference getStatemachineOperation_More();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard <em>Statemachine Guard</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Guard</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineGuard
+	 * @generated
+	 */
+	EClass getStatemachineGuard();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getGuard <em>Guard</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Guard</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getGuard()
+	 * @see #getStatemachineGuard()
+	 * @generated
+	 */
+	EReference getStatemachineGuard_Guard();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#isHasOnFail <em>Has On Fail</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Has On Fail</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineGuard#isHasOnFail()
+	 * @see #getStatemachineGuard()
+	 * @generated
+	 */
+	EAttribute getStatemachineGuard_HasOnFail();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailDescription <em>On Fail Description</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>On Fail Description</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailDescription()
+	 * @see #getStatemachineGuard()
+	 * @generated
+	 */
+	EAttribute getStatemachineGuard_OnFailDescription();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailCaption <em>On Fail Caption</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>On Fail Caption</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailCaption()
+	 * @see #getStatemachineGuard()
+	 * @generated
+	 */
+	EAttribute getStatemachineGuard_OnFailCaption();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailType <em>On Fail Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>On Fail Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailType()
+	 * @see #getStatemachineGuard()
+	 * @generated
+	 */
+	EAttribute getStatemachineGuard_OnFailType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction <em>Statemachine Function</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Function</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineFunction
+	 * @generated
+	 */
+	EClass getStatemachineFunction();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getFunction <em>Function</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Function</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getFunction()
+	 * @see #getStatemachineFunction()
+	 * @generated
+	 */
+	EReference getStatemachineFunction_Function();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getFirst <em>First</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>First</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getFirst()
+	 * @see #getStatemachineFunction()
+	 * @generated
+	 */
+	EReference getStatemachineFunction_First();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getMore <em>More</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>More</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getMore()
+	 * @see #getStatemachineFunction()
+	 * @generated
+	 */
+	EReference getStatemachineFunction_More();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve <em>Statemachine Storage Retrieve</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Storage Retrieve</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve
+	 * @generated
+	 */
+	EClass getStatemachineStorageRetrieve();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve#getKey <em>Key</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Key</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve#getKey()
+	 * @see #getStatemachineStorageRetrieve()
+	 * @generated
+	 */
+	EAttribute getStatemachineStorageRetrieve_Key();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve#getAttribute()
+	 * @see #getStatemachineStorageRetrieve()
+	 * @generated
+	 */
+	EAttribute getStatemachineStorageRetrieve_Attribute();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage <em>Statemachine Storage</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Storage</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorage
+	 * @generated
+	 */
+	EClass getStatemachineStorage();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getKey <em>Key</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Key</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getKey()
+	 * @see #getStatemachineStorage()
+	 * @generated
+	 */
+	EAttribute getStatemachineStorage_Key();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getAttribute()
+	 * @see #getStatemachineStorage()
+	 * @generated
+	 */
+	EAttribute getStatemachineStorage_Attribute();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getContent <em>Content</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Content</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getContent()
+	 * @see #getStatemachineStorage()
+	 * @generated
+	 */
+	EReference getStatemachineStorage_Content();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation <em>Statemachine Action Field Concatenation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Concatenation</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldConcatenation();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation#getFirst <em>First</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>First</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation#getFirst()
+	 * @see #getStatemachineActionFieldConcatenation()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldConcatenation_First();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation#getMore <em>More</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>More</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation#getMore()
+	 * @see #getStatemachineActionFieldConcatenation()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldConcatenation_More();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet <em>Statemachine Action Field Set</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Set</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldSet();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet#getAttribute()
+	 * @see #getStatemachineActionFieldSet()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldSet_Attribute();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet#getSource <em>Source</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Source</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet#getSource()
+	 * @see #getStatemachineActionFieldSet()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldSet_Source();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke <em>Statemachine Action Field Keystroke</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Keystroke</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldKeystroke();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke#getAttribute()
+	 * @see #getStatemachineActionFieldKeystroke()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldKeystroke_Attribute();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke#getKeystroke <em>Keystroke</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Keystroke</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke#getKeystroke()
+	 * @see #getStatemachineActionFieldKeystroke()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionFieldKeystroke_Keystroke();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear <em>Statemachine Action Field Clear</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Clear</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldClear();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear#getAttribute()
+	 * @see #getStatemachineActionFieldClear()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldClear_Attribute();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet <em>Statemachine Action Field Get</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Get</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldGet();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet#getAttribute()
+	 * @see #getStatemachineActionFieldGet()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldGet_Attribute();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove <em>Statemachine Action Field Remove</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Field Remove</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove
+	 * @generated
+	 */
+	EClass getStatemachineActionFieldRemove();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove#getAttribute()
+	 * @see #getStatemachineActionFieldRemove()
+	 * @generated
+	 */
+	EReference getStatemachineActionFieldRemove_Attribute();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible <em>Statemachine Action Item Visible</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Item Visible</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible
+	 * @generated
+	 */
+	EClass getStatemachineActionItemVisible();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible#getAttribute()
+	 * @see #getStatemachineActionItemVisible()
+	 * @generated
+	 */
+	EReference getStatemachineActionItemVisible_Attribute();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible <em>Statemachine Action Item Invisible</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Item Invisible</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible
+	 * @generated
+	 */
+	EClass getStatemachineActionItemInvisible();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible#getAttribute()
+	 * @see #getStatemachineActionItemInvisible()
+	 * @generated
+	 */
+	EReference getStatemachineActionItemInvisible_Attribute();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption <em>Statemachine Action Button Caption</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Button Caption</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption
+	 * @generated
+	 */
+	EClass getStatemachineActionButtonCaption();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption#getAttribute()
+	 * @see #getStatemachineActionButtonCaption()
+	 * @generated
+	 */
+	EReference getStatemachineActionButtonCaption_Attribute();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption#getCaption <em>Caption</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Caption</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption#getCaption()
+	 * @see #getStatemachineActionButtonCaption()
+	 * @generated
+	 */
+	EReference getStatemachineActionButtonCaption_Caption();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage <em>Statemachine Action Button Image</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Button Image</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage
+	 * @generated
+	 */
+	EClass getStatemachineActionButtonImage();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage#getAttribute()
+	 * @see #getStatemachineActionButtonImage()
+	 * @generated
+	 */
+	EReference getStatemachineActionButtonImage_Attribute();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage#getImage <em>Image</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Image</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage#getImage()
+	 * @see #getStatemachineActionButtonImage()
+	 * @generated
+	 */
+	EAttribute getStatemachineActionButtonImage_Image();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind <em>Statemachine Action DTO Find</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action DTO Find</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind
+	 * @generated
+	 */
+	EClass getStatemachineActionDTOFind();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getDto <em>Dto</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Dto</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getDto()
+	 * @see #getStatemachineActionDTOFind()
+	 * @generated
+	 */
+	EReference getStatemachineActionDTOFind_Dto();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getAttribute()
+	 * @see #getStatemachineActionDTOFind()
+	 * @generated
+	 */
+	EReference getStatemachineActionDTOFind_Attribute();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getSearch <em>Search</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Search</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind#getSearch()
+	 * @see #getStatemachineActionDTOFind()
+	 * @generated
+	 */
+	EReference getStatemachineActionDTOFind_Search();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler <em>Statemachine Action Scheduler</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Action Scheduler</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler
+	 * @generated
+	 */
+	EClass getStatemachineActionScheduler();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler#getScheduler <em>Scheduler</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Scheduler</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler#getScheduler()
+	 * @see #getStatemachineActionScheduler()
+	 * @generated
+	 */
+	EReference getStatemachineActionScheduler_Scheduler();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineDTOType <em>Statemachine DTO Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine DTO Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDTOType
+	 * @generated
+	 */
+	EClass getStatemachineDTOType();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.statemachine.StatemachineDTOType#getAttributeType <em>Attribute Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDTOType#getAttributeType()
+	 * @see #getStatemachineDTOType()
+	 * @generated
+	 */
+	EReference getStatemachineDTOType_AttributeType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFieldType <em>Statemachine Field Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine Field Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineFieldType
+	 * @generated
+	 */
+	EClass getStatemachineFieldType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFieldType#getAttributeType <em>Attribute Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Attribute Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineFieldType#getAttributeType()
+	 * @see #getStatemachineFieldType()
+	 * @generated
+	 */
+	EAttribute getStatemachineFieldType_AttributeType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineInternalType <em>Statemachine Internal Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine Internal Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineInternalType
+	 * @generated
+	 */
+	EEnum getStatemachineInternalType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType <em>Statemachine Control Button Event Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine Control Button Event Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType
+	 * @generated
+	 */
+	EEnum getStatemachineControlButtonEventType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType <em>Statemachine Evaluation Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine Evaluation Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType
+	 * @generated
+	 */
+	EEnum getStatemachineEvaluationType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType <em>Statemachine User Message Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine User Message Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType
+	 * @generated
+	 */
+	EEnum getStatemachineUserMessageType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType <em>Statemachine Line Display Cursor Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine Line Display Cursor Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType
+	 * @generated
+	 */
+	EEnum getStatemachineLineDisplayCursorType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType <em>Statemachine Line Display Marquee Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine Line Display Marquee Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType
+	 * @generated
+	 */
+	EEnum getStatemachineLineDisplayMarqueeType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat <em>Statemachine Line Display Marquee Format</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine Line Display Marquee Format</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat
+	 * @generated
+	 */
+	EEnum getStatemachineLineDisplayMarqueeFormat();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType <em>Statemachine Line Display Text Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine Line Display Text Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType
+	 * @generated
+	 */
+	EEnum getStatemachineLineDisplayTextType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType <em>Statemachine Line Display Scroll Text Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine Line Display Scroll Text Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType
+	 * @generated
+	 */
+	EEnum getStatemachineLineDisplayScrollTextType();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType <em>Statemachine POS Printer Barcode Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Statemachine POS Printer Barcode Type</em>'.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType
+	 * @generated
+	 */
+	EEnum getStatemachinePOSPrinterBarcodeType();
+
+	/**
+	 * Returns the meta object for data type '{@link org.eclipse.emf.ecore.InternalEObject <em>Internal EObject</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for data type '<em>Internal EObject</em>'.
+	 * @see org.eclipse.emf.ecore.InternalEObject
+	 * @model instanceClass="org.eclipse.emf.ecore.InternalEObject"
+	 * @generated
+	 */
+	EDataType getInternalEObject();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	StatemachineDSLFactory getStatemachineDSLFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineModelImpl <em>Statemachine Model</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineModelImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineModel()
+		 * @generated
+		 */
+		EClass STATEMACHINE_MODEL = eINSTANCE.getStatemachineModel();
+
+		/**
+		 * The meta object literal for the '<em><b>Packages</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_MODEL__PACKAGES = eINSTANCE.getStatemachineModel_Packages();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineLazyResolverImpl <em>Statemachine Lazy Resolver</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineLazyResolverImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLazyResolver()
+		 * @generated
+		 */
+		EClass STATEMACHINE_LAZY_RESOLVER = eINSTANCE.getStatemachineLazyResolver();
+
+		/**
+		 * The meta object literal for the '<em><b>EResolve Proxy</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = eINSTANCE.getStatemachineLazyResolver__EResolveProxy__InternalEObject();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineBaseImpl <em>Statemachine Base</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineBaseImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineBase()
+		 * @generated
+		 */
+		EClass STATEMACHINE_BASE = eINSTANCE.getStatemachineBase();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_BASE__NAME = eINSTANCE.getStatemachineBase_Name();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePackageImpl <em>Statemachine Package</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePackageImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePackage()
+		 * @generated
+		 */
+		EClass STATEMACHINE_PACKAGE = eINSTANCE.getStatemachinePackage();
+
+		/**
+		 * The meta object literal for the '<em><b>Statemachines</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_PACKAGE__STATEMACHINES = eINSTANCE.getStatemachinePackage_Statemachines();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl <em>Statemachine</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachine()
+		 * @generated
+		 */
+		EClass STATEMACHINE = eINSTANCE.getStatemachine();
+
+		/**
+		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE__DESCRIPTION = eINSTANCE.getStatemachine_Description();
+
+		/**
+		 * The meta object literal for the '<em><b>Description Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE__DESCRIPTION_VALUE = eINSTANCE.getStatemachine_DescriptionValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Function Group</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE__FUNCTION_GROUP = eINSTANCE.getStatemachine_FunctionGroup();
+
+		/**
+		 * The meta object literal for the '<em><b>Initial Event</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE__INITIAL_EVENT = eINSTANCE.getStatemachine_InitialEvent();
+
+		/**
+		 * The meta object literal for the '<em><b>Initial State</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE__INITIAL_STATE = eINSTANCE.getStatemachine_InitialState();
+
+		/**
+		 * The meta object literal for the '<em><b>Events</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE__EVENTS = eINSTANCE.getStatemachine_Events();
+
+		/**
+		 * The meta object literal for the '<em><b>Controls</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE__CONTROLS = eINSTANCE.getStatemachine_Controls();
+
+		/**
+		 * The meta object literal for the '<em><b>States</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE__STATES = eINSTANCE.getStatemachine_States();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControl <em>Statemachine Control</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControl()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL = eINSTANCE.getStatemachineControl();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonImpl <em>Statemachine Control Button</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButton()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_BUTTON = eINSTANCE.getStatemachineControlButton();
+
+		/**
+		 * The meta object literal for the '<em><b>Event Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_CONTROL_BUTTON__EVENT_TYPE = eINSTANCE.getStatemachineControlButton_EventType();
+
+		/**
+		 * The meta object literal for the '<em><b>Buttons</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_BUTTON__BUTTONS = eINSTANCE.getStatemachineControlButton_Buttons();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldImpl <em>Statemachine Control Field</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlField()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_FIELD = eINSTANCE.getStatemachineControlField();
+
+		/**
+		 * The meta object literal for the '<em><b>Fields</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_FIELD__FIELDS = eINSTANCE.getStatemachineControlField_Fields();
+
+		/**
+		 * The meta object literal for the '<em><b>Layouts</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_FIELD__LAYOUTS = eINSTANCE.getStatemachineControlField_Layouts();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOImpl <em>Statemachine Control DTO</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlDTO()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_DTO = eINSTANCE.getStatemachineControlDTO();
+
+		/**
+		 * The meta object literal for the '<em><b>Dtos</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_DTO__DTOS = eINSTANCE.getStatemachineControlDTO_Dtos();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerImpl <em>Statemachine Control Scheduler</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlScheduler()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_SCHEDULER = eINSTANCE.getStatemachineControlScheduler();
+
+		/**
+		 * The meta object literal for the '<em><b>Schedulers</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS = eINSTANCE.getStatemachineControlScheduler_Schedulers();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlPeripheralImpl <em>Statemachine Control Peripheral</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlPeripheralImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlPeripheral()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_PERIPHERAL = eINSTANCE.getStatemachineControlPeripheral();
+
+		/**
+		 * The meta object literal for the '<em><b>Line Displays</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS = eINSTANCE.getStatemachineControlPeripheral_LineDisplays();
+
+		/**
+		 * The meta object literal for the '<em><b>Pos Printers</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS = eINSTANCE.getStatemachineControlPeripheral_PosPrinters();
+
+		/**
+		 * The meta object literal for the '<em><b>Cash Drawers</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS = eINSTANCE.getStatemachineControlPeripheral_CashDrawers();
+
+		/**
+		 * The meta object literal for the '<em><b>Payment Terminals</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS = eINSTANCE.getStatemachineControlPeripheral_PaymentTerminals();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeImpl <em>Statemachine Control Button Attribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttribute()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE = eINSTANCE.getStatemachineControlButtonAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Has Image</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__HAS_IMAGE = eINSTANCE.getStatemachineControlButtonAttribute_HasImage();
+
+		/**
+		 * The meta object literal for the '<em><b>Image</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__IMAGE = eINSTANCE.getStatemachineControlButtonAttribute_Image();
+
+		/**
+		 * The meta object literal for the '<em><b>Event</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT = eINSTANCE.getStatemachineControlButtonAttribute_Event();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent <em>Statemachine Control Button Attribute Event</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttributeEvent()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT = eINSTANCE.getStatemachineControlButtonAttributeEvent();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventKeyboardImpl <em>Statemachine Control Button Attribute Event Keyboard</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventKeyboardImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttributeEventKeyboard()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD = eINSTANCE.getStatemachineControlButtonAttributeEventKeyboard();
+
+		/**
+		 * The meta object literal for the '<em><b>Keystroke</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE = eINSTANCE.getStatemachineControlButtonAttributeEventKeyboard_Keystroke();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventIdentityImpl <em>Statemachine Control Button Attribute Event Identity</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventIdentityImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttributeEventIdentity()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY = eINSTANCE.getStatemachineControlButtonAttributeEventIdentity();
+
+		/**
+		 * The meta object literal for the '<em><b>Identity</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY = eINSTANCE.getStatemachineControlButtonAttributeEventIdentity_Identity();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventEventImpl <em>Statemachine Control Button Attribute Event Event</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventEventImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonAttributeEventEvent()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT = eINSTANCE.getStatemachineControlButtonAttributeEventEvent();
+
+		/**
+		 * The meta object literal for the '<em><b>Event</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT = eINSTANCE.getStatemachineControlButtonAttributeEventEvent_Event();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility <em>Statemachine Control Visibility</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlVisibility()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_VISIBILITY = eINSTANCE.getStatemachineControlVisibility();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldAttributeImpl <em>Statemachine Control Field Attribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldAttributeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlFieldAttribute()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_FIELD_ATTRIBUTE = eINSTANCE.getStatemachineControlFieldAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute Type</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE = eINSTANCE.getStatemachineControlFieldAttribute_AttributeType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldLayoutImpl <em>Statemachine Control Field Layout</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldLayoutImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlFieldLayout()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_FIELD_LAYOUT = eINSTANCE.getStatemachineControlFieldLayout();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOAttributeImpl <em>Statemachine Control DTO Attribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOAttributeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlDTOAttribute()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_DTO_ATTRIBUTE = eINSTANCE.getStatemachineControlDTOAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute Type</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE = eINSTANCE.getStatemachineControlDTOAttribute_AttributeType();
+
+		/**
+		 * The meta object literal for the '<em><b>Has Event</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_CONTROL_DTO_ATTRIBUTE__HAS_EVENT = eINSTANCE.getStatemachineControlDTOAttribute_HasEvent();
+
+		/**
+		 * The meta object literal for the '<em><b>Event</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT = eINSTANCE.getStatemachineControlDTOAttribute_Event();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice <em>Statemachine Peripheral Device</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDevice()
+		 * @generated
+		 */
+		EClass STATEMACHINE_PERIPHERAL_DEVICE = eINSTANCE.getStatemachinePeripheralDevice();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDeviceLineDisplayImpl <em>Statemachine Peripheral Device Line Display</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDeviceLineDisplayImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDeviceLineDisplay()
+		 * @generated
+		 */
+		EClass STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY = eINSTANCE.getStatemachinePeripheralDeviceLineDisplay();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDevicePOSPrinterImpl <em>Statemachine Peripheral Device POS Printer</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDevicePOSPrinterImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDevicePOSPrinter()
+		 * @generated
+		 */
+		EClass STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER = eINSTANCE.getStatemachinePeripheralDevicePOSPrinter();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDeviceCashDrawerImpl <em>Statemachine Peripheral Device Cash Drawer</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDeviceCashDrawerImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDeviceCashDrawer()
+		 * @generated
+		 */
+		EClass STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER = eINSTANCE.getStatemachinePeripheralDeviceCashDrawer();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDevicePTImpl <em>Statemachine Peripheral Device PT</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachinePeripheralDevicePTImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePeripheralDevicePT()
+		 * @generated
+		 */
+		EClass STATEMACHINE_PERIPHERAL_DEVICE_PT = eINSTANCE.getStatemachinePeripheralDevicePT();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerAttributeImpl <em>Statemachine Control Scheduler Attribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerAttributeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlSchedulerAttribute()
+		 * @generated
+		 */
+		EClass STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE = eINSTANCE.getStatemachineControlSchedulerAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Delay</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY = eINSTANCE.getStatemachineControlSchedulerAttribute_Delay();
+
+		/**
+		 * The meta object literal for the '<em><b>Event</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT = eINSTANCE.getStatemachineControlSchedulerAttribute_Event();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineEventImpl <em>Statemachine Event</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineEventImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineEvent()
+		 * @generated
+		 */
+		EClass STATEMACHINE_EVENT = eINSTANCE.getStatemachineEvent();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl <em>Statemachine State</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineState()
+		 * @generated
+		 */
+		EClass STATEMACHINE_STATE = eINSTANCE.getStatemachineState();
+
+		/**
+		 * The meta object literal for the '<em><b>Triggers</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_STATE__TRIGGERS = eINSTANCE.getStatemachineState_Triggers();
+
+		/**
+		 * The meta object literal for the '<em><b>Identity</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_STATE__IDENTITY = eINSTANCE.getStatemachineState_Identity();
+
+		/**
+		 * The meta object literal for the '<em><b>Keystroke</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_STATE__KEYSTROKE = eINSTANCE.getStatemachineState_Keystroke();
+
+		/**
+		 * The meta object literal for the '<em><b>Has Key Operation</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_STATE__HAS_KEY_OPERATION = eINSTANCE.getStatemachineState_HasKeyOperation();
+
+		/**
+		 * The meta object literal for the '<em><b>Key Operation</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_STATE__KEY_OPERATION = eINSTANCE.getStatemachineState_KeyOperation();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl <em>Statemachine Trigger</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineTrigger()
+		 * @generated
+		 */
+		EClass STATEMACHINE_TRIGGER = eINSTANCE.getStatemachineTrigger();
+
+		/**
+		 * The meta object literal for the '<em><b>Has Transition</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_TRIGGER__HAS_TRANSITION = eINSTANCE.getStatemachineTrigger_HasTransition();
+
+		/**
+		 * The meta object literal for the '<em><b>Transition</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_TRIGGER__TRANSITION = eINSTANCE.getStatemachineTrigger_Transition();
+
+		/**
+		 * The meta object literal for the '<em><b>Triggers</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_TRIGGER__TRIGGERS = eINSTANCE.getStatemachineTrigger_Triggers();
+
+		/**
+		 * The meta object literal for the '<em><b>Guards</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_TRIGGER__GUARDS = eINSTANCE.getStatemachineTrigger_Guards();
+
+		/**
+		 * The meta object literal for the '<em><b>Actions</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_TRIGGER__ACTIONS = eINSTANCE.getStatemachineTrigger_Actions();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineAction <em>Statemachine Action</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineAction
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineAction()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION = eINSTANCE.getStatemachineAction();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralBlinkRateImpl <em>Statemachine Action Peripheral Blink Rate</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralBlinkRateImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralBlinkRate()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE = eINSTANCE.getStatemachineActionPeripheralBlinkRate();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE = eINSTANCE.getStatemachineActionPeripheralBlinkRate_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Blink Rate</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE = eINSTANCE.getStatemachineActionPeripheralBlinkRate_BlinkRate();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralClearImpl <em>Statemachine Action Peripheral Clear</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralClearImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralClear()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_CLEAR = eINSTANCE.getStatemachineActionPeripheralClear();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE = eINSTANCE.getStatemachineActionPeripheralClear_Device();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl <em>Statemachine Action Peripheral Create Window</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralCreateWindow()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW = eINSTANCE.getStatemachineActionPeripheralCreateWindow();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE = eINSTANCE.getStatemachineActionPeripheralCreateWindow_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Viewport Row</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW = eINSTANCE.getStatemachineActionPeripheralCreateWindow_ViewportRow();
+
+		/**
+		 * The meta object literal for the '<em><b>Viewport Column</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN = eINSTANCE.getStatemachineActionPeripheralCreateWindow_ViewportColumn();
+
+		/**
+		 * The meta object literal for the '<em><b>Viewport Height</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT = eINSTANCE.getStatemachineActionPeripheralCreateWindow_ViewportHeight();
+
+		/**
+		 * The meta object literal for the '<em><b>Viewport Width</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH = eINSTANCE.getStatemachineActionPeripheralCreateWindow_ViewportWidth();
+
+		/**
+		 * The meta object literal for the '<em><b>Window Height</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT = eINSTANCE.getStatemachineActionPeripheralCreateWindow_WindowHeight();
+
+		/**
+		 * The meta object literal for the '<em><b>Window Width</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH = eINSTANCE.getStatemachineActionPeripheralCreateWindow_WindowWidth();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCursorTypeImpl <em>Statemachine Action Peripheral Cursor Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCursorTypeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralCursorType()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE = eINSTANCE.getStatemachineActionPeripheralCursorType();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE = eINSTANCE.getStatemachineActionPeripheralCursorType_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Cursor Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE = eINSTANCE.getStatemachineActionPeripheralCursorType_CursorType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDestroyWindowImpl <em>Statemachine Action Peripheral Destroy Window</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDestroyWindowImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDestroyWindow()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW = eINSTANCE.getStatemachineActionPeripheralDestroyWindow();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE = eINSTANCE.getStatemachineActionPeripheralDestroyWindow_Device();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDeviceBrightnessImpl <em>Statemachine Action Peripheral Device Brightness</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDeviceBrightnessImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDeviceBrightness()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS = eINSTANCE.getStatemachineActionPeripheralDeviceBrightness();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE = eINSTANCE.getStatemachineActionPeripheralDeviceBrightness_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Brightness</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS = eINSTANCE.getStatemachineActionPeripheralDeviceBrightness_Brightness();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayBitmapImpl <em>Statemachine Action Peripheral Display Bitmap</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayBitmapImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDisplayBitmap()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP = eINSTANCE.getStatemachineActionPeripheralDisplayBitmap();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE = eINSTANCE.getStatemachineActionPeripheralDisplayBitmap_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Bitmap Id</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID = eINSTANCE.getStatemachineActionPeripheralDisplayBitmap_BitmapId();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextImpl <em>Statemachine Action Peripheral Display Text</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDisplayText()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT = eINSTANCE.getStatemachineActionPeripheralDisplayText();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE = eINSTANCE.getStatemachineActionPeripheralDisplayText_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Text</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT = eINSTANCE.getStatemachineActionPeripheralDisplayText_Text();
+
+		/**
+		 * The meta object literal for the '<em><b>Has Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__HAS_TYPE = eINSTANCE.getStatemachineActionPeripheralDisplayText_HasType();
+
+		/**
+		 * The meta object literal for the '<em><b>Text Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT_TYPE = eINSTANCE.getStatemachineActionPeripheralDisplayText_TextType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl <em>Statemachine Action Peripheral Display Text At</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralDisplayTextAt()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT = eINSTANCE.getStatemachineActionPeripheralDisplayTextAt();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE = eINSTANCE.getStatemachineActionPeripheralDisplayTextAt_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Row</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__ROW = eINSTANCE.getStatemachineActionPeripheralDisplayTextAt_Row();
+
+		/**
+		 * The meta object literal for the '<em><b>Column</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__COLUMN = eINSTANCE.getStatemachineActionPeripheralDisplayTextAt_Column();
+
+		/**
+		 * The meta object literal for the '<em><b>Text</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT = eINSTANCE.getStatemachineActionPeripheralDisplayTextAt_Text();
+
+		/**
+		 * The meta object literal for the '<em><b>Has Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__HAS_TYPE = eINSTANCE.getStatemachineActionPeripheralDisplayTextAt_HasType();
+
+		/**
+		 * The meta object literal for the '<em><b>Text Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT_TYPE = eINSTANCE.getStatemachineActionPeripheralDisplayTextAt_TextType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralInterCharacterWaitImpl <em>Statemachine Action Peripheral Inter Character Wait</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralInterCharacterWaitImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralInterCharacterWait()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT = eINSTANCE.getStatemachineActionPeripheralInterCharacterWait();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE = eINSTANCE.getStatemachineActionPeripheralInterCharacterWait_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Wait</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT = eINSTANCE.getStatemachineActionPeripheralInterCharacterWait_Wait();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeFormatImpl <em>Statemachine Action Peripheral Marquee Format</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeFormatImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralMarqueeFormat()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT = eINSTANCE.getStatemachineActionPeripheralMarqueeFormat();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE = eINSTANCE.getStatemachineActionPeripheralMarqueeFormat_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Format</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT = eINSTANCE.getStatemachineActionPeripheralMarqueeFormat_Format();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeRepeatWaitImpl <em>Statemachine Action Peripheral Marquee Repeat Wait</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeRepeatWaitImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralMarqueeRepeatWait()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT = eINSTANCE.getStatemachineActionPeripheralMarqueeRepeatWait();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE = eINSTANCE.getStatemachineActionPeripheralMarqueeRepeatWait_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Wait</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT = eINSTANCE.getStatemachineActionPeripheralMarqueeRepeatWait_Wait();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeTypeImpl <em>Statemachine Action Peripheral Marquee Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeTypeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralMarqueeType()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE = eINSTANCE.getStatemachineActionPeripheralMarqueeType();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE = eINSTANCE.getStatemachineActionPeripheralMarqueeType_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Marquee Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE = eINSTANCE.getStatemachineActionPeripheralMarqueeType_MarqueeType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeUnitWaitImpl <em>Statemachine Action Peripheral Marquee Unit Wait</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeUnitWaitImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralMarqueeUnitWait()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT = eINSTANCE.getStatemachineActionPeripheralMarqueeUnitWait();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE = eINSTANCE.getStatemachineActionPeripheralMarqueeUnitWait_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Wait</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT = eINSTANCE.getStatemachineActionPeripheralMarqueeUnitWait_Wait();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralScrollImpl <em>Statemachine Action Peripheral Scroll</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralScrollImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralScroll()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_SCROLL = eINSTANCE.getStatemachineActionPeripheralScroll();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE = eINSTANCE.getStatemachineActionPeripheralScroll_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Direction</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION = eINSTANCE.getStatemachineActionPeripheralScroll_Direction();
+
+		/**
+		 * The meta object literal for the '<em><b>Units</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS = eINSTANCE.getStatemachineActionPeripheralScroll_Units();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralOpenDrawerImpl <em>Statemachine Action Peripheral Open Drawer</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralOpenDrawerImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralOpenDrawer()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER = eINSTANCE.getStatemachineActionPeripheralOpenDrawer();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE = eINSTANCE.getStatemachineActionPeripheralOpenDrawer_Device();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBarcodeImpl <em>Statemachine Action Peripheral Print Barcode</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBarcodeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintBarcode()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE = eINSTANCE.getStatemachineActionPeripheralPrintBarcode();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE = eINSTANCE.getStatemachineActionPeripheralPrintBarcode_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Data</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA = eINSTANCE.getStatemachineActionPeripheralPrintBarcode_Data();
+
+		/**
+		 * The meta object literal for the '<em><b>Barcode Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE = eINSTANCE.getStatemachineActionPeripheralPrintBarcode_BarcodeType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBitmapImpl <em>Statemachine Action Peripheral Print Bitmap</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBitmapImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintBitmap()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP = eINSTANCE.getStatemachineActionPeripheralPrintBitmap();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE = eINSTANCE.getStatemachineActionPeripheralPrintBitmap_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Bitmap Id</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID = eINSTANCE.getStatemachineActionPeripheralPrintBitmap_BitmapId();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintCutImpl <em>Statemachine Action Peripheral Print Cut</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintCutImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintCut()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT = eINSTANCE.getStatemachineActionPeripheralPrintCut();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE = eINSTANCE.getStatemachineActionPeripheralPrintCut_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Text</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT = eINSTANCE.getStatemachineActionPeripheralPrintCut_Text();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintRegisterBitmapImpl <em>Statemachine Action Peripheral Print Register Bitmap</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintRegisterBitmapImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintRegisterBitmap()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP = eINSTANCE.getStatemachineActionPeripheralPrintRegisterBitmap();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE = eINSTANCE.getStatemachineActionPeripheralPrintRegisterBitmap_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Bitmap Id</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID = eINSTANCE.getStatemachineActionPeripheralPrintRegisterBitmap_BitmapId();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME = eINSTANCE.getStatemachineActionPeripheralPrintRegisterBitmap_Name();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintNormalImpl <em>Statemachine Action Peripheral Print Normal</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintNormalImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintNormal()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL = eINSTANCE.getStatemachineActionPeripheralPrintNormal();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE = eINSTANCE.getStatemachineActionPeripheralPrintNormal_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Text</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT = eINSTANCE.getStatemachineActionPeripheralPrintNormal_Text();
+
+		/**
+		 * The meta object literal for the '<em><b>Barcode Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__BARCODE_TYPE = eINSTANCE.getStatemachineActionPeripheralPrintNormal_BarcodeType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTOpenImpl <em>Statemachine Action Peripheral PT Open</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTOpenImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTOpen()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN = eINSTANCE.getStatemachineActionPeripheralPTOpen();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE = eINSTANCE.getStatemachineActionPeripheralPTOpen_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Host</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST = eINSTANCE.getStatemachineActionPeripheralPTOpen_Host();
+
+		/**
+		 * The meta object literal for the '<em><b>Port</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT = eINSTANCE.getStatemachineActionPeripheralPTOpen_Port();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTCloseImpl <em>Statemachine Action Peripheral PT Close</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTCloseImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTClose()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE = eINSTANCE.getStatemachineActionPeripheralPTClose();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE = eINSTANCE.getStatemachineActionPeripheralPTClose_Device();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTReversalImpl <em>Statemachine Action Peripheral PT Reversal</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTReversalImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTReversal()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL = eINSTANCE.getStatemachineActionPeripheralPTReversal();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE = eINSTANCE.getStatemachineActionPeripheralPTReversal_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Password</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD = eINSTANCE.getStatemachineActionPeripheralPTReversal_Password();
+
+		/**
+		 * The meta object literal for the '<em><b>Receipt</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT = eINSTANCE.getStatemachineActionPeripheralPTReversal_Receipt();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAcknowledgeImpl <em>Statemachine Action Peripheral PT Acknowledge</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAcknowledgeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTAcknowledge()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE = eINSTANCE.getStatemachineActionPeripheralPTAcknowledge();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE = eINSTANCE.getStatemachineActionPeripheralPTAcknowledge_Device();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTRegistrationImpl <em>Statemachine Action Peripheral PT Registration</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTRegistrationImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTRegistration()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION = eINSTANCE.getStatemachineActionPeripheralPTRegistration();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE = eINSTANCE.getStatemachineActionPeripheralPTRegistration_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Password</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD = eINSTANCE.getStatemachineActionPeripheralPTRegistration_Password();
+
+		/**
+		 * The meta object literal for the '<em><b>Configuration</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION = eINSTANCE.getStatemachineActionPeripheralPTRegistration_Configuration();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAuthorizationImpl <em>Statemachine Action Peripheral PT Authorization</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAuthorizationImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTAuthorization()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION = eINSTANCE.getStatemachineActionPeripheralPTAuthorization();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE = eINSTANCE.getStatemachineActionPeripheralPTAuthorization_Device();
+
+		/**
+		 * The meta object literal for the '<em><b>Amount</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT = eINSTANCE.getStatemachineActionPeripheralPTAuthorization_Amount();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTResponseImpl <em>Statemachine Action Peripheral PT Response</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTResponseImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPTResponse()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE = eINSTANCE.getStatemachineActionPeripheralPTResponse();
+
+		/**
+		 * The meta object literal for the '<em><b>Device</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE = eINSTANCE.getStatemachineActionPeripheralPTResponse_Device();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintReportImpl <em>Statemachine Action Peripheral Print Report</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintReportImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionPeripheralPrintReport()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT = eINSTANCE.getStatemachineActionPeripheralPrintReport();
+
+		/**
+		 * The meta object literal for the '<em><b>Report</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT = eINSTANCE.getStatemachineActionPeripheralPrintReport_Report();
+
+		/**
+		 * The meta object literal for the '<em><b>Key</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY = eINSTANCE.getStatemachineActionPeripheralPrintReport_Key();
+
+		/**
+		 * The meta object literal for the '<em><b>Has Filter</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__HAS_FILTER = eINSTANCE.getStatemachineActionPeripheralPrintReport_HasFilter();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource <em>Statemachine Action Field Source</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSource()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_SOURCE = eINSTANCE.getStatemachineActionFieldSource();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceStringImpl <em>Statemachine Action Field Source String</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceStringImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceString()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_SOURCE_STRING = eINSTANCE.getStatemachineActionFieldSourceString();
+
+		/**
+		 * The meta object literal for the '<em><b>Text</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT = eINSTANCE.getStatemachineActionFieldSourceString_Text();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceNumberImpl <em>Statemachine Action Field Source Number</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceNumberImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceNumber()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER = eINSTANCE.getStatemachineActionFieldSourceNumber();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE = eINSTANCE.getStatemachineActionFieldSourceNumber_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEvaluateImpl <em>Statemachine Action Field Source Evaluate</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEvaluateImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceEvaluate()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE = eINSTANCE.getStatemachineActionFieldSourceEvaluate();
+
+		/**
+		 * The meta object literal for the '<em><b>Evaluationtype</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE = eINSTANCE.getStatemachineActionFieldSourceEvaluate_Evaluationtype();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceTranslateImpl <em>Statemachine Action Field Source Translate</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceTranslateImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceTranslate()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE = eINSTANCE.getStatemachineActionFieldSourceTranslate();
+
+		/**
+		 * The meta object literal for the '<em><b>Text</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT = eINSTANCE.getStatemachineActionFieldSourceTranslate_Text();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceDtoAttributeImpl <em>Statemachine Action Field Source Dto Attribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceDtoAttributeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceDtoAttribute()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE = eINSTANCE.getStatemachineActionFieldSourceDtoAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Dto</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO = eINSTANCE.getStatemachineActionFieldSourceDtoAttribute_Dto();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE = eINSTANCE.getStatemachineActionFieldSourceDtoAttribute_Attribute();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEventImpl <em>Statemachine Action Field Source Event</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEventImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSourceEvent()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_SOURCE_EVENT = eINSTANCE.getStatemachineActionFieldSourceEvent();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionConditionalTransitionImpl <em>Statemachine Action Conditional Transition</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionConditionalTransitionImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionConditionalTransition()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_CONDITIONAL_TRANSITION = eINSTANCE.getStatemachineActionConditionalTransition();
+
+		/**
+		 * The meta object literal for the '<em><b>Transition</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION = eINSTANCE.getStatemachineActionConditionalTransition_Transition();
+
+		/**
+		 * The meta object literal for the '<em><b>Guard</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD = eINSTANCE.getStatemachineActionConditionalTransition_Guard();
+
+		/**
+		 * The meta object literal for the '<em><b>Actions</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS = eINSTANCE.getStatemachineActionConditionalTransition_Actions();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationParameterImpl <em>Statemachine Operation Parameter</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationParameterImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineOperationParameter()
+		 * @generated
+		 */
+		EClass STATEMACHINE_OPERATION_PARAMETER = eINSTANCE.getStatemachineOperationParameter();
+
+		/**
+		 * The meta object literal for the '<em><b>Source</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_OPERATION_PARAMETER__SOURCE = eINSTANCE.getStatemachineOperationParameter_Source();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationImpl <em>Statemachine Operation</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineOperation()
+		 * @generated
+		 */
+		EClass STATEMACHINE_OPERATION = eINSTANCE.getStatemachineOperation();
+
+		/**
+		 * The meta object literal for the '<em><b>Operation</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_OPERATION__OPERATION = eINSTANCE.getStatemachineOperation_Operation();
+
+		/**
+		 * The meta object literal for the '<em><b>First</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_OPERATION__FIRST = eINSTANCE.getStatemachineOperation_First();
+
+		/**
+		 * The meta object literal for the '<em><b>More</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_OPERATION__MORE = eINSTANCE.getStatemachineOperation_More();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl <em>Statemachine Guard</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineGuard()
+		 * @generated
+		 */
+		EClass STATEMACHINE_GUARD = eINSTANCE.getStatemachineGuard();
+
+		/**
+		 * The meta object literal for the '<em><b>Guard</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_GUARD__GUARD = eINSTANCE.getStatemachineGuard_Guard();
+
+		/**
+		 * The meta object literal for the '<em><b>Has On Fail</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_GUARD__HAS_ON_FAIL = eINSTANCE.getStatemachineGuard_HasOnFail();
+
+		/**
+		 * The meta object literal for the '<em><b>On Fail Description</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_GUARD__ON_FAIL_DESCRIPTION = eINSTANCE.getStatemachineGuard_OnFailDescription();
+
+		/**
+		 * The meta object literal for the '<em><b>On Fail Caption</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_GUARD__ON_FAIL_CAPTION = eINSTANCE.getStatemachineGuard_OnFailCaption();
+
+		/**
+		 * The meta object literal for the '<em><b>On Fail Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_GUARD__ON_FAIL_TYPE = eINSTANCE.getStatemachineGuard_OnFailType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineFunctionImpl <em>Statemachine Function</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineFunctionImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineFunction()
+		 * @generated
+		 */
+		EClass STATEMACHINE_FUNCTION = eINSTANCE.getStatemachineFunction();
+
+		/**
+		 * The meta object literal for the '<em><b>Function</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_FUNCTION__FUNCTION = eINSTANCE.getStatemachineFunction_Function();
+
+		/**
+		 * The meta object literal for the '<em><b>First</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_FUNCTION__FIRST = eINSTANCE.getStatemachineFunction_First();
+
+		/**
+		 * The meta object literal for the '<em><b>More</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_FUNCTION__MORE = eINSTANCE.getStatemachineFunction_More();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageRetrieveImpl <em>Statemachine Storage Retrieve</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageRetrieveImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineStorageRetrieve()
+		 * @generated
+		 */
+		EClass STATEMACHINE_STORAGE_RETRIEVE = eINSTANCE.getStatemachineStorageRetrieve();
+
+		/**
+		 * The meta object literal for the '<em><b>Key</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_STORAGE_RETRIEVE__KEY = eINSTANCE.getStatemachineStorageRetrieve_Key();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE = eINSTANCE.getStatemachineStorageRetrieve_Attribute();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageImpl <em>Statemachine Storage</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineStorage()
+		 * @generated
+		 */
+		EClass STATEMACHINE_STORAGE = eINSTANCE.getStatemachineStorage();
+
+		/**
+		 * The meta object literal for the '<em><b>Key</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_STORAGE__KEY = eINSTANCE.getStatemachineStorage_Key();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_STORAGE__ATTRIBUTE = eINSTANCE.getStatemachineStorage_Attribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Content</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_STORAGE__CONTENT = eINSTANCE.getStatemachineStorage_Content();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldConcatenationImpl <em>Statemachine Action Field Concatenation</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldConcatenationImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldConcatenation()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_CONCATENATION = eINSTANCE.getStatemachineActionFieldConcatenation();
+
+		/**
+		 * The meta object literal for the '<em><b>First</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST = eINSTANCE.getStatemachineActionFieldConcatenation_First();
+
+		/**
+		 * The meta object literal for the '<em><b>More</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE = eINSTANCE.getStatemachineActionFieldConcatenation_More();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSetImpl <em>Statemachine Action Field Set</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSetImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldSet()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_SET = eINSTANCE.getStatemachineActionFieldSet();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE = eINSTANCE.getStatemachineActionFieldSet_Attribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Source</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_SET__SOURCE = eINSTANCE.getStatemachineActionFieldSet_Source();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldKeystrokeImpl <em>Statemachine Action Field Keystroke</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldKeystrokeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldKeystroke()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_KEYSTROKE = eINSTANCE.getStatemachineActionFieldKeystroke();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE = eINSTANCE.getStatemachineActionFieldKeystroke_Attribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Keystroke</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_FIELD_KEYSTROKE__KEYSTROKE = eINSTANCE.getStatemachineActionFieldKeystroke_Keystroke();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldClearImpl <em>Statemachine Action Field Clear</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldClearImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldClear()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_CLEAR = eINSTANCE.getStatemachineActionFieldClear();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE = eINSTANCE.getStatemachineActionFieldClear_Attribute();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldGetImpl <em>Statemachine Action Field Get</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldGetImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldGet()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_GET = eINSTANCE.getStatemachineActionFieldGet();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE = eINSTANCE.getStatemachineActionFieldGet_Attribute();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldRemoveImpl <em>Statemachine Action Field Remove</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldRemoveImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionFieldRemove()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_FIELD_REMOVE = eINSTANCE.getStatemachineActionFieldRemove();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE = eINSTANCE.getStatemachineActionFieldRemove_Attribute();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemVisibleImpl <em>Statemachine Action Item Visible</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemVisibleImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionItemVisible()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_ITEM_VISIBLE = eINSTANCE.getStatemachineActionItemVisible();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE = eINSTANCE.getStatemachineActionItemVisible_Attribute();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemInvisibleImpl <em>Statemachine Action Item Invisible</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemInvisibleImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionItemInvisible()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_ITEM_INVISIBLE = eINSTANCE.getStatemachineActionItemInvisible();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE = eINSTANCE.getStatemachineActionItemInvisible_Attribute();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonCaptionImpl <em>Statemachine Action Button Caption</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonCaptionImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionButtonCaption()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_BUTTON_CAPTION = eINSTANCE.getStatemachineActionButtonCaption();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE = eINSTANCE.getStatemachineActionButtonCaption_Attribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Caption</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION = eINSTANCE.getStatemachineActionButtonCaption_Caption();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonImageImpl <em>Statemachine Action Button Image</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonImageImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionButtonImage()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_BUTTON_IMAGE = eINSTANCE.getStatemachineActionButtonImage();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE = eINSTANCE.getStatemachineActionButtonImage_Attribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Image</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE = eINSTANCE.getStatemachineActionButtonImage_Image();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionDTOFindImpl <em>Statemachine Action DTO Find</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionDTOFindImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionDTOFind()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_DTO_FIND = eINSTANCE.getStatemachineActionDTOFind();
+
+		/**
+		 * The meta object literal for the '<em><b>Dto</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_DTO_FIND__DTO = eINSTANCE.getStatemachineActionDTOFind_Dto();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE = eINSTANCE.getStatemachineActionDTOFind_Attribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Search</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_DTO_FIND__SEARCH = eINSTANCE.getStatemachineActionDTOFind_Search();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionSchedulerImpl <em>Statemachine Action Scheduler</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionSchedulerImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineActionScheduler()
+		 * @generated
+		 */
+		EClass STATEMACHINE_ACTION_SCHEDULER = eINSTANCE.getStatemachineActionScheduler();
+
+		/**
+		 * The meta object literal for the '<em><b>Scheduler</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_ACTION_SCHEDULER__SCHEDULER = eINSTANCE.getStatemachineActionScheduler_Scheduler();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineDTOTypeImpl <em>Statemachine DTO Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDTOTypeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineDTOType()
+		 * @generated
+		 */
+		EClass STATEMACHINE_DTO_TYPE = eINSTANCE.getStatemachineDTOType();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute Type</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE = eINSTANCE.getStatemachineDTOType_AttributeType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineFieldTypeImpl <em>Statemachine Field Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineFieldTypeImpl
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineFieldType()
+		 * @generated
+		 */
+		EClass STATEMACHINE_FIELD_TYPE = eINSTANCE.getStatemachineFieldType();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE = eINSTANCE.getStatemachineFieldType_AttributeType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineInternalType <em>Statemachine Internal Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineInternalType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineInternalType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_INTERNAL_TYPE = eINSTANCE.getStatemachineInternalType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType <em>Statemachine Control Button Event Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineControlButtonEventType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_CONTROL_BUTTON_EVENT_TYPE = eINSTANCE.getStatemachineControlButtonEventType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType <em>Statemachine Evaluation Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineEvaluationType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_EVALUATION_TYPE = eINSTANCE.getStatemachineEvaluationType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType <em>Statemachine User Message Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineUserMessageType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_USER_MESSAGE_TYPE = eINSTANCE.getStatemachineUserMessageType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType <em>Statemachine Line Display Cursor Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayCursorType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_LINE_DISPLAY_CURSOR_TYPE = eINSTANCE.getStatemachineLineDisplayCursorType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType <em>Statemachine Line Display Marquee Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayMarqueeType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_LINE_DISPLAY_MARQUEE_TYPE = eINSTANCE.getStatemachineLineDisplayMarqueeType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat <em>Statemachine Line Display Marquee Format</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayMarqueeFormat()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_LINE_DISPLAY_MARQUEE_FORMAT = eINSTANCE.getStatemachineLineDisplayMarqueeFormat();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType <em>Statemachine Line Display Text Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayTextType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_LINE_DISPLAY_TEXT_TYPE = eINSTANCE.getStatemachineLineDisplayTextType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType <em>Statemachine Line Display Scroll Text Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachineLineDisplayScrollTextType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_LINE_DISPLAY_SCROLL_TEXT_TYPE = eINSTANCE.getStatemachineLineDisplayScrollTextType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType <em>Statemachine POS Printer Barcode Type</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getStatemachinePOSPrinterBarcodeType()
+		 * @generated
+		 */
+		EEnum STATEMACHINE_POS_PRINTER_BARCODE_TYPE = eINSTANCE.getStatemachinePOSPrinterBarcodeType();
+
+		/**
+		 * The meta object literal for the '<em>Internal EObject</em>' data type.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.emf.ecore.InternalEObject
+		 * @see org.eclipse.osbp.xtext.statemachine.impl.StatemachineDSLPackageImpl#getInternalEObject()
+		 * @generated
+		 */
+		EDataType INTERNAL_EOBJECT = eINSTANCE.getInternalEObject();
+
+	}
+
+} //StatemachineDSLPackage
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDTOType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDTOType.java
new file mode 100644
index 0000000..d7942e6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDTOType.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.osbp.dsl.semantic.dto.LDto;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine DTO Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineDTOType#getAttributeType <em>Attribute Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineDTOType()
+ * @model
+ * @generated
+ */
+public interface StatemachineDTOType extends StatemachineLazyResolver {
+	/**
+	 * Returns the value of the '<em><b>Attribute Type</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute Type</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute Type</em>' reference.
+	 * @see #setAttributeType(LDto)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineDTOType_AttributeType()
+	 * @model
+	 * @generated
+	 */
+	LDto getAttributeType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineDTOType#getAttributeType <em>Attribute Type</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute Type</em>' reference.
+	 * @see #getAttributeType()
+	 * @generated
+	 */
+	void setAttributeType(LDto value);
+
+} // StatemachineDTOType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineEvaluationType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineEvaluationType.java
new file mode 100644
index 0000000..911c451
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineEvaluationType.java
@@ -0,0 +1,530 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine Evaluation Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineEvaluationType()
+ * @model
+ * @generated
+ */
+public enum StatemachineEvaluationType implements Enumerator {
+	/**
+	 * The '<em><b>IP ADDRESS</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IP_ADDRESS_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	IP_ADDRESS(0, "IP_ADDRESS", "getIPAddress"),
+
+	/**
+	 * The '<em><b>NOW</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #NOW_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	NOW(0, "NOW", "getNow"),
+
+	/**
+	 * The '<em><b>USER AGENT INFO</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #USER_AGENT_INFO_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	USER_AGENT_INFO(0, "USER_AGENT_INFO", "getUserAgentInfo"),
+
+	/**
+	 * The '<em><b>IS TOUCH DEVICE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IS_TOUCH_DEVICE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	IS_TOUCH_DEVICE(0, "IS_TOUCH_DEVICE", "isTouchDevice"),
+
+	/**
+	 * The '<em><b>IS HTTPS</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IS_HTTPS_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	IS_HTTPS(0, "IS_HTTPS", "isHttps"),
+
+	/**
+	 * The '<em><b>BROWSER LOCALE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BROWSER_LOCALE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BROWSER_LOCALE(0, "BROWSER_LOCALE", "getBrowserLocale"),
+
+	/**
+	 * The '<em><b>USER NAME</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #USER_NAME_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	USER_NAME(0, "USER_NAME", "getUserName"),
+
+	/**
+	 * The '<em><b>USER PASSWORD</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #USER_PASSWORD_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	USER_PASSWORD(0, "USER_PASSWORD", "getUserPassword"),
+
+	/**
+	 * The '<em><b>USER EMAIL</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #USER_EMAIL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	USER_EMAIL(0, "USER_EMAIL", "getUserEmail"),
+
+	/**
+	 * The '<em><b>USER POSITION</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #USER_POSITION_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	USER_POSITION(0, "USER_POSITION", "getUserPosition"),
+
+	/**
+	 * The '<em><b>USER PRTSERVICE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #USER_PRTSERVICE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	USER_PRTSERVICE(0, "USER_PRTSERVICE", "getUserPrintService"),
+
+	/**
+	 * The '<em><b>SCREEN WIDTH</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SCREEN_WIDTH_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SCREEN_WIDTH(0, "SCREEN_WIDTH", "getSceenWidth"),
+
+	/**
+	 * The '<em><b>SCREEN HEIGHT</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SCREEN_HEIGHT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SCREEN_HEIGHT(0, "SCREEN_HEIGHT", "getScreenHeight"),
+
+	/**
+	 * The '<em><b>TRIGGER</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #TRIGGER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	TRIGGER(0, "TRIGGER", "getTrigger");
+
+	/**
+	 * The '<em><b>IP ADDRESS</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>IP ADDRESS</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #IP_ADDRESS
+	 * @model literal="getIPAddress"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int IP_ADDRESS_VALUE = 0;
+
+	/**
+	 * The '<em><b>NOW</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>NOW</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #NOW
+	 * @model literal="getNow"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int NOW_VALUE = 0;
+
+	/**
+	 * The '<em><b>USER AGENT INFO</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>USER AGENT INFO</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #USER_AGENT_INFO
+	 * @model literal="getUserAgentInfo"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int USER_AGENT_INFO_VALUE = 0;
+
+	/**
+	 * The '<em><b>IS TOUCH DEVICE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>IS TOUCH DEVICE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #IS_TOUCH_DEVICE
+	 * @model literal="isTouchDevice"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int IS_TOUCH_DEVICE_VALUE = 0;
+
+	/**
+	 * The '<em><b>IS HTTPS</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>IS HTTPS</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #IS_HTTPS
+	 * @model literal="isHttps"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int IS_HTTPS_VALUE = 0;
+
+	/**
+	 * The '<em><b>BROWSER LOCALE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>BROWSER LOCALE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BROWSER_LOCALE
+	 * @model literal="getBrowserLocale"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BROWSER_LOCALE_VALUE = 0;
+
+	/**
+	 * The '<em><b>USER NAME</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>USER NAME</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #USER_NAME
+	 * @model literal="getUserName"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int USER_NAME_VALUE = 0;
+
+	/**
+	 * The '<em><b>USER PASSWORD</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>USER PASSWORD</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #USER_PASSWORD
+	 * @model literal="getUserPassword"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int USER_PASSWORD_VALUE = 0;
+
+	/**
+	 * The '<em><b>USER EMAIL</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>USER EMAIL</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #USER_EMAIL
+	 * @model literal="getUserEmail"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int USER_EMAIL_VALUE = 0;
+
+	/**
+	 * The '<em><b>USER POSITION</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>USER POSITION</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #USER_POSITION
+	 * @model literal="getUserPosition"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int USER_POSITION_VALUE = 0;
+
+	/**
+	 * The '<em><b>USER PRTSERVICE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>USER PRTSERVICE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #USER_PRTSERVICE
+	 * @model literal="getUserPrintService"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int USER_PRTSERVICE_VALUE = 0;
+
+	/**
+	 * The '<em><b>SCREEN WIDTH</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>SCREEN WIDTH</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SCREEN_WIDTH
+	 * @model literal="getSceenWidth"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SCREEN_WIDTH_VALUE = 0;
+
+	/**
+	 * The '<em><b>SCREEN HEIGHT</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>SCREEN HEIGHT</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SCREEN_HEIGHT
+	 * @model literal="getScreenHeight"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SCREEN_HEIGHT_VALUE = 0;
+
+	/**
+	 * The '<em><b>TRIGGER</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>TRIGGER</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #TRIGGER
+	 * @model literal="getTrigger"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int TRIGGER_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine Evaluation Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineEvaluationType[] VALUES_ARRAY =
+		new StatemachineEvaluationType[] {
+			IP_ADDRESS,
+			NOW,
+			USER_AGENT_INFO,
+			IS_TOUCH_DEVICE,
+			IS_HTTPS,
+			BROWSER_LOCALE,
+			USER_NAME,
+			USER_PASSWORD,
+			USER_EMAIL,
+			USER_POSITION,
+			USER_PRTSERVICE,
+			SCREEN_WIDTH,
+			SCREEN_HEIGHT,
+			TRIGGER,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine Evaluation Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineEvaluationType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine Evaluation Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineEvaluationType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineEvaluationType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Evaluation Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineEvaluationType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineEvaluationType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Evaluation Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineEvaluationType get(int value) {
+		switch (value) {
+			case IP_ADDRESS_VALUE: return IP_ADDRESS;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineEvaluationType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineEvaluationType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineEvent.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineEvent.java
new file mode 100644
index 0000000..41e4e9a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineEvent.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Event</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineEvent()
+ * @model
+ * @generated
+ */
+public interface StatemachineEvent extends StatemachineBase {
+} // StatemachineEvent
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineFieldType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineFieldType.java
new file mode 100644
index 0000000..6f4702e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineFieldType.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Field Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineFieldType#getAttributeType <em>Attribute Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineFieldType()
+ * @model
+ * @generated
+ */
+public interface StatemachineFieldType extends StatemachineLazyResolver {
+	/**
+	 * Returns the value of the '<em><b>Attribute Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineInternalType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineInternalType
+	 * @see #setAttributeType(StatemachineInternalType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineFieldType_AttributeType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineInternalType getAttributeType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFieldType#getAttributeType <em>Attribute Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineInternalType
+	 * @see #getAttributeType()
+	 * @generated
+	 */
+	void setAttributeType(StatemachineInternalType value);
+
+} // StatemachineFieldType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineFunction.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineFunction.java
new file mode 100644
index 0000000..e2d9b4c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineFunction.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryFunction;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Function</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getFunction <em>Function</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getFirst <em>First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getMore <em>More</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineFunction()
+ * @model
+ * @generated
+ */
+public interface StatemachineFunction extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Function</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Function</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Function</em>' reference.
+	 * @see #setFunction(FunctionLibraryFunction)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineFunction_Function()
+	 * @model
+	 * @generated
+	 */
+	FunctionLibraryFunction getFunction();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getFunction <em>Function</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Function</em>' reference.
+	 * @see #getFunction()
+	 * @generated
+	 */
+	void setFunction(FunctionLibraryFunction value);
+
+	/**
+	 * Returns the value of the '<em><b>First</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>First</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>First</em>' containment reference.
+	 * @see #setFirst(StatemachineOperationParameter)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineFunction_First()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineOperationParameter getFirst();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction#getFirst <em>First</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>First</em>' containment reference.
+	 * @see #getFirst()
+	 * @generated
+	 */
+	void setFirst(StatemachineOperationParameter value);
+
+	/**
+	 * Returns the value of the '<em><b>More</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>More</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>More</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineFunction_More()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineOperationParameter> getMore();
+
+} // StatemachineFunction
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineGuard.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineGuard.java
new file mode 100644
index 0000000..24856ae
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineGuard.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryGuard;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Guard</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getGuard <em>Guard</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#isHasOnFail <em>Has On Fail</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailDescription <em>On Fail Description</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailCaption <em>On Fail Caption</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailType <em>On Fail Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineGuard()
+ * @model
+ * @generated
+ */
+public interface StatemachineGuard extends StatemachineLazyResolver {
+	/**
+	 * Returns the value of the '<em><b>Guard</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Guard</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Guard</em>' reference.
+	 * @see #setGuard(FunctionLibraryGuard)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineGuard_Guard()
+	 * @model
+	 * @generated
+	 */
+	FunctionLibraryGuard getGuard();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getGuard <em>Guard</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Guard</em>' reference.
+	 * @see #getGuard()
+	 * @generated
+	 */
+	void setGuard(FunctionLibraryGuard value);
+
+	/**
+	 * Returns the value of the '<em><b>Has On Fail</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Has On Fail</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Has On Fail</em>' attribute.
+	 * @see #setHasOnFail(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineGuard_HasOnFail()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isHasOnFail();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#isHasOnFail <em>Has On Fail</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Has On Fail</em>' attribute.
+	 * @see #isHasOnFail()
+	 * @generated
+	 */
+	void setHasOnFail(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>On Fail Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>On Fail Description</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>On Fail Description</em>' attribute.
+	 * @see #setOnFailDescription(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineGuard_OnFailDescription()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getOnFailDescription();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailDescription <em>On Fail Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>On Fail Description</em>' attribute.
+	 * @see #getOnFailDescription()
+	 * @generated
+	 */
+	void setOnFailDescription(String value);
+
+	/**
+	 * Returns the value of the '<em><b>On Fail Caption</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>On Fail Caption</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>On Fail Caption</em>' attribute.
+	 * @see #setOnFailCaption(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineGuard_OnFailCaption()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getOnFailCaption();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailCaption <em>On Fail Caption</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>On Fail Caption</em>' attribute.
+	 * @see #getOnFailCaption()
+	 * @generated
+	 */
+	void setOnFailCaption(String value);
+
+	/**
+	 * Returns the value of the '<em><b>On Fail Type</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>On Fail Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>On Fail Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType
+	 * @see #setOnFailType(StatemachineUserMessageType)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineGuard_OnFailType()
+	 * @model unique="false"
+	 * @generated
+	 */
+	StatemachineUserMessageType getOnFailType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard#getOnFailType <em>On Fail Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>On Fail Type</em>' attribute.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType
+	 * @see #getOnFailType()
+	 * @generated
+	 */
+	void setOnFailType(StatemachineUserMessageType value);
+
+} // StatemachineGuard
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineInternalType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineInternalType.java
new file mode 100644
index 0000000..3fb3975
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineInternalType.java
@@ -0,0 +1,348 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine Internal Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineInternalType()
+ * @model
+ * @generated
+ */
+public enum StatemachineInternalType implements Enumerator {
+	/**
+	 * The '<em><b>BOOLEAN</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BOOLEAN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BOOLEAN(0, "BOOLEAN", "Boolean"),
+
+	/**
+	 * The '<em><b>INTEGER</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INTEGER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INTEGER(0, "INTEGER", "Integer"),
+
+	/**
+	 * The '<em><b>LONG</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LONG_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LONG(0, "LONG", "Long"),
+
+	/**
+	 * The '<em><b>DOUBLE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DOUBLE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DOUBLE(0, "DOUBLE", "Double"),
+
+	/**
+	 * The '<em><b>STRING</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STRING_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	STRING(0, "STRING", "String"),
+
+	/**
+	 * The '<em><b>DATE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DATE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DATE(0, "DATE", "Date"),
+
+	/**
+	 * The '<em><b>SUGGESTTEXT</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SUGGESTTEXT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SUGGESTTEXT(0, "SUGGESTTEXT", "SuggestText");
+
+	/**
+	 * The '<em><b>BOOLEAN</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>BOOLEAN</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BOOLEAN
+	 * @model literal="Boolean"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BOOLEAN_VALUE = 0;
+
+	/**
+	 * The '<em><b>INTEGER</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>INTEGER</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INTEGER
+	 * @model literal="Integer"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INTEGER_VALUE = 0;
+
+	/**
+	 * The '<em><b>LONG</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>LONG</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LONG
+	 * @model literal="Long"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LONG_VALUE = 0;
+
+	/**
+	 * The '<em><b>DOUBLE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DOUBLE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DOUBLE
+	 * @model literal="Double"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DOUBLE_VALUE = 0;
+
+	/**
+	 * The '<em><b>STRING</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>STRING</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #STRING
+	 * @model literal="String"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int STRING_VALUE = 0;
+
+	/**
+	 * The '<em><b>DATE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DATE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DATE
+	 * @model literal="Date"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DATE_VALUE = 0;
+
+	/**
+	 * The '<em><b>SUGGESTTEXT</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>SUGGESTTEXT</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SUGGESTTEXT
+	 * @model literal="SuggestText"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SUGGESTTEXT_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine Internal Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineInternalType[] VALUES_ARRAY =
+		new StatemachineInternalType[] {
+			BOOLEAN,
+			INTEGER,
+			LONG,
+			DOUBLE,
+			STRING,
+			DATE,
+			SUGGESTTEXT,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine Internal Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineInternalType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine Internal Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineInternalType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineInternalType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Internal Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineInternalType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineInternalType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Internal Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineInternalType get(int value) {
+		switch (value) {
+			case BOOLEAN_VALUE: return BOOLEAN;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineInternalType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineInternalType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLazyResolver.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLazyResolver.java
new file mode 100644
index 0000000..c563667
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLazyResolver.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Lazy Resolver</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineLazyResolver()
+ * @model
+ * @generated
+ */
+public interface StatemachineLazyResolver extends EObject {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model unique="false" proxyDataType="org.eclipse.osbp.xtext.statemachine.InternalEObject" proxyUnique="false"
+	 *        annotation="http://www.eclipse.org/emf/2002/GenModel body='<%org.eclipse.emf.ecore.resource.Resource%> _eResource = this.eResource();\n<%org.eclipse.emf.ecore.resource.ResourceSet%> _resourceSet = _eResource.getResourceSet();\nreturn <%org.eclipse.osbp.dsl.xtext.lazyresolver.api.EcoreUtil3%>.resolve(proxy, _resourceSet);'"
+	 * @generated
+	 */
+	EObject eResolveProxy(InternalEObject proxy);
+
+} // StatemachineLazyResolver
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayCursorType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayCursorType.java
new file mode 100644
index 0000000..e897b23
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayCursorType.java
@@ -0,0 +1,374 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine Line Display Cursor Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineLineDisplayCursorType()
+ * @model
+ * @generated
+ */
+public enum StatemachineLineDisplayCursorType implements Enumerator {
+	/**
+	 * The '<em><b>DISP CT NONE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_NONE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_CT_NONE(0, "DISP_CT_NONE", "none"),
+
+	/**
+	 * The '<em><b>DISP CT FIXED</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_FIXED_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_CT_FIXED(0, "DISP_CT_FIXED", "fixed"),
+
+	/**
+	 * The '<em><b>DISP CT BLOCK</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_BLOCK_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_CT_BLOCK(0, "DISP_CT_BLOCK", "block"),
+
+	/**
+	 * The '<em><b>DISP CT HALFBLOCK</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_HALFBLOCK_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_CT_HALFBLOCK(0, "DISP_CT_HALFBLOCK", "halfblock"),
+
+	/**
+	 * The '<em><b>DISP CT UNDERLINE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_UNDERLINE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_CT_UNDERLINE(0, "DISP_CT_UNDERLINE", "underline"),
+
+	/**
+	 * The '<em><b>DISP CT REVERSE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_REVERSE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_CT_REVERSE(0, "DISP_CT_REVERSE", "reverse"),
+
+	/**
+	 * The '<em><b>DISP CT OTHER</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_OTHER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_CT_OTHER(0, "DISP_CT_OTHER", "other"),
+
+	/**
+	 * The '<em><b>DISP CT BLINK</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_BLINK_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_CT_BLINK(0, "DISP_CT_BLINK", "blink");
+
+	/**
+	 * The '<em><b>DISP CT NONE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP CT NONE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_NONE
+	 * @model literal="none"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_CT_NONE_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP CT FIXED</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP CT FIXED</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_FIXED
+	 * @model literal="fixed"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_CT_FIXED_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP CT BLOCK</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP CT BLOCK</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_BLOCK
+	 * @model literal="block"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_CT_BLOCK_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP CT HALFBLOCK</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP CT HALFBLOCK</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_HALFBLOCK
+	 * @model literal="halfblock"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_CT_HALFBLOCK_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP CT UNDERLINE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP CT UNDERLINE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_UNDERLINE
+	 * @model literal="underline"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_CT_UNDERLINE_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP CT REVERSE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP CT REVERSE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_REVERSE
+	 * @model literal="reverse"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_CT_REVERSE_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP CT OTHER</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP CT OTHER</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_OTHER
+	 * @model literal="other"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_CT_OTHER_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP CT BLINK</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP CT BLINK</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_CT_BLINK
+	 * @model literal="blink"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_CT_BLINK_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine Line Display Cursor Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineLineDisplayCursorType[] VALUES_ARRAY =
+		new StatemachineLineDisplayCursorType[] {
+			DISP_CT_NONE,
+			DISP_CT_FIXED,
+			DISP_CT_BLOCK,
+			DISP_CT_HALFBLOCK,
+			DISP_CT_UNDERLINE,
+			DISP_CT_REVERSE,
+			DISP_CT_OTHER,
+			DISP_CT_BLINK,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine Line Display Cursor Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineLineDisplayCursorType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Cursor Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayCursorType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayCursorType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Cursor Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayCursorType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayCursorType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Cursor Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayCursorType get(int value) {
+		switch (value) {
+			case DISP_CT_NONE_VALUE: return DISP_CT_NONE;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineLineDisplayCursorType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineLineDisplayCursorType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayMarqueeFormat.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayMarqueeFormat.java
new file mode 100644
index 0000000..fe5dada
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayMarqueeFormat.java
@@ -0,0 +1,218 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine Line Display Marquee Format</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineLineDisplayMarqueeFormat()
+ * @model
+ * @generated
+ */
+public enum StatemachineLineDisplayMarqueeFormat implements Enumerator {
+	/**
+	 * The '<em><b>DISP MF WALK</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MF_WALK_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_MF_WALK(0, "DISP_MF_WALK", "walk"),
+
+	/**
+	 * The '<em><b>DISP MF PLACE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MF_PLACE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_MF_PLACE(0, "DISP_MF_PLACE", "place");
+
+	/**
+	 * The '<em><b>DISP MF WALK</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP MF WALK</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MF_WALK
+	 * @model literal="walk"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_MF_WALK_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP MF PLACE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP MF PLACE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MF_PLACE
+	 * @model literal="place"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_MF_PLACE_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine Line Display Marquee Format</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineLineDisplayMarqueeFormat[] VALUES_ARRAY =
+		new StatemachineLineDisplayMarqueeFormat[] {
+			DISP_MF_WALK,
+			DISP_MF_PLACE,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine Line Display Marquee Format</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineLineDisplayMarqueeFormat> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Marquee Format</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayMarqueeFormat get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayMarqueeFormat result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Marquee Format</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayMarqueeFormat getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayMarqueeFormat result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Marquee Format</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayMarqueeFormat get(int value) {
+		switch (value) {
+			case DISP_MF_WALK_VALUE: return DISP_MF_WALK;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineLineDisplayMarqueeFormat(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineLineDisplayMarqueeFormat
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayMarqueeType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayMarqueeType.java
new file mode 100644
index 0000000..0126091
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayMarqueeType.java
@@ -0,0 +1,322 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine Line Display Marquee Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineLineDisplayMarqueeType()
+ * @model
+ * @generated
+ */
+public enum StatemachineLineDisplayMarqueeType implements Enumerator {
+	/**
+	 * The '<em><b>DISP MT NONE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_NONE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_MT_NONE(0, "DISP_MT_NONE", "none"),
+
+	/**
+	 * The '<em><b>DISP MT UP</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_UP_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_MT_UP(0, "DISP_MT_UP", "up"),
+
+	/**
+	 * The '<em><b>DISP MT DOWN</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_DOWN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_MT_DOWN(0, "DISP_MT_DOWN", "down"),
+
+	/**
+	 * The '<em><b>DISP MT LEFT</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_LEFT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_MT_LEFT(0, "DISP_MT_LEFT", "left"),
+
+	/**
+	 * The '<em><b>DISP MT RIGHT</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_RIGHT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_MT_RIGHT(0, "DISP_MT_RIGHT", "right"),
+
+	/**
+	 * The '<em><b>DISP MT INIT</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_INIT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_MT_INIT(0, "DISP_MT_INIT", "init");
+
+	/**
+	 * The '<em><b>DISP MT NONE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP MT NONE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_NONE
+	 * @model literal="none"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_MT_NONE_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP MT UP</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP MT UP</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_UP
+	 * @model literal="up"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_MT_UP_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP MT DOWN</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP MT DOWN</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_DOWN
+	 * @model literal="down"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_MT_DOWN_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP MT LEFT</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP MT LEFT</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_LEFT
+	 * @model literal="left"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_MT_LEFT_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP MT RIGHT</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP MT RIGHT</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_RIGHT
+	 * @model literal="right"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_MT_RIGHT_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP MT INIT</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP MT INIT</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_MT_INIT
+	 * @model literal="init"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_MT_INIT_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine Line Display Marquee Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineLineDisplayMarqueeType[] VALUES_ARRAY =
+		new StatemachineLineDisplayMarqueeType[] {
+			DISP_MT_NONE,
+			DISP_MT_UP,
+			DISP_MT_DOWN,
+			DISP_MT_LEFT,
+			DISP_MT_RIGHT,
+			DISP_MT_INIT,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine Line Display Marquee Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineLineDisplayMarqueeType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Marquee Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayMarqueeType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayMarqueeType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Marquee Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayMarqueeType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayMarqueeType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Marquee Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayMarqueeType get(int value) {
+		switch (value) {
+			case DISP_MT_NONE_VALUE: return DISP_MT_NONE;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineLineDisplayMarqueeType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineLineDisplayMarqueeType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayScrollTextType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayScrollTextType.java
new file mode 100644
index 0000000..cbee2e1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayScrollTextType.java
@@ -0,0 +1,270 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine Line Display Scroll Text Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineLineDisplayScrollTextType()
+ * @model
+ * @generated
+ */
+public enum StatemachineLineDisplayScrollTextType implements Enumerator {
+	/**
+	 * The '<em><b>DISP ST UP</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_ST_UP_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_ST_UP(0, "DISP_ST_UP", "up"),
+
+	/**
+	 * The '<em><b>DISP ST DOWN</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_ST_DOWN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_ST_DOWN(0, "DISP_ST_DOWN", "down"),
+
+	/**
+	 * The '<em><b>DISP ST LEFT</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_ST_LEFT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_ST_LEFT(0, "DISP_ST_LEFT", "left"),
+
+	/**
+	 * The '<em><b>DISP ST RIGHT</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_ST_RIGHT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_ST_RIGHT(0, "DISP_ST_RIGHT", "right");
+
+	/**
+	 * The '<em><b>DISP ST UP</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP ST UP</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_ST_UP
+	 * @model literal="up"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_ST_UP_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP ST DOWN</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP ST DOWN</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_ST_DOWN
+	 * @model literal="down"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_ST_DOWN_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP ST LEFT</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP ST LEFT</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_ST_LEFT
+	 * @model literal="left"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_ST_LEFT_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP ST RIGHT</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP ST RIGHT</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_ST_RIGHT
+	 * @model literal="right"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_ST_RIGHT_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine Line Display Scroll Text Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineLineDisplayScrollTextType[] VALUES_ARRAY =
+		new StatemachineLineDisplayScrollTextType[] {
+			DISP_ST_UP,
+			DISP_ST_DOWN,
+			DISP_ST_LEFT,
+			DISP_ST_RIGHT,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine Line Display Scroll Text Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineLineDisplayScrollTextType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Scroll Text Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayScrollTextType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayScrollTextType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Scroll Text Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayScrollTextType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayScrollTextType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Scroll Text Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayScrollTextType get(int value) {
+		switch (value) {
+			case DISP_ST_UP_VALUE: return DISP_ST_UP;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineLineDisplayScrollTextType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineLineDisplayScrollTextType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayTextType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayTextType.java
new file mode 100644
index 0000000..5dea407
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineLineDisplayTextType.java
@@ -0,0 +1,270 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine Line Display Text Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineLineDisplayTextType()
+ * @model
+ * @generated
+ */
+public enum StatemachineLineDisplayTextType implements Enumerator {
+	/**
+	 * The '<em><b>DISP DT NORMAL</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_DT_NORMAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_DT_NORMAL(0, "DISP_DT_NORMAL", "normal"),
+
+	/**
+	 * The '<em><b>DISP DT BLINK</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_DT_BLINK_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_DT_BLINK(0, "DISP_DT_BLINK", "blink"),
+
+	/**
+	 * The '<em><b>DISP DT REVERSE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_DT_REVERSE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_DT_REVERSE(0, "DISP_DT_REVERSE", "reverse"),
+
+	/**
+	 * The '<em><b>DISP DT BLINK REVERSE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISP_DT_BLINK_REVERSE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISP_DT_BLINK_REVERSE(0, "DISP_DT_BLINK_REVERSE", "blinkreverse");
+
+	/**
+	 * The '<em><b>DISP DT NORMAL</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP DT NORMAL</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_DT_NORMAL
+	 * @model literal="normal"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_DT_NORMAL_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP DT BLINK</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP DT BLINK</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_DT_BLINK
+	 * @model literal="blink"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_DT_BLINK_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP DT REVERSE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP DT REVERSE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_DT_REVERSE
+	 * @model literal="reverse"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_DT_REVERSE_VALUE = 0;
+
+	/**
+	 * The '<em><b>DISP DT BLINK REVERSE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>DISP DT BLINK REVERSE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISP_DT_BLINK_REVERSE
+	 * @model literal="blinkreverse"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISP_DT_BLINK_REVERSE_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine Line Display Text Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineLineDisplayTextType[] VALUES_ARRAY =
+		new StatemachineLineDisplayTextType[] {
+			DISP_DT_NORMAL,
+			DISP_DT_BLINK,
+			DISP_DT_REVERSE,
+			DISP_DT_BLINK_REVERSE,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine Line Display Text Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineLineDisplayTextType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Text Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayTextType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayTextType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Text Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayTextType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineLineDisplayTextType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine Line Display Text Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineLineDisplayTextType get(int value) {
+		switch (value) {
+			case DISP_DT_NORMAL_VALUE: return DISP_DT_NORMAL;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineLineDisplayTextType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineLineDisplayTextType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineModel.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineModel.java
new file mode 100644
index 0000000..3e51f81
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineModel.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Model</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineModel#getPackages <em>Packages</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineModel()
+ * @model
+ * @generated
+ */
+public interface StatemachineModel extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Packages</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachinePackage}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Packages</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Packages</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineModel_Packages()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachinePackage> getPackages();
+
+} // StatemachineModel
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineOperation.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineOperation.java
new file mode 100644
index 0000000..733875f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineOperation.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryOperation;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Operation</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getOperation <em>Operation</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getFirst <em>First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getMore <em>More</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineOperation()
+ * @model
+ * @generated
+ */
+public interface StatemachineOperation extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Operation</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operation</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operation</em>' reference.
+	 * @see #setOperation(FunctionLibraryOperation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineOperation_Operation()
+	 * @model
+	 * @generated
+	 */
+	FunctionLibraryOperation getOperation();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getOperation <em>Operation</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operation</em>' reference.
+	 * @see #getOperation()
+	 * @generated
+	 */
+	void setOperation(FunctionLibraryOperation value);
+
+	/**
+	 * Returns the value of the '<em><b>First</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>First</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>First</em>' containment reference.
+	 * @see #setFirst(StatemachineOperationParameter)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineOperation_First()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineOperationParameter getFirst();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation#getFirst <em>First</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>First</em>' containment reference.
+	 * @see #getFirst()
+	 * @generated
+	 */
+	void setFirst(StatemachineOperationParameter value);
+
+	/**
+	 * Returns the value of the '<em><b>More</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>More</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>More</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineOperation_More()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineOperationParameter> getMore();
+
+} // StatemachineOperation
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineOperationParameter.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineOperationParameter.java
new file mode 100644
index 0000000..159dba7
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineOperationParameter.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Operation Parameter</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter#getSource <em>Source</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineOperationParameter()
+ * @model
+ * @generated
+ */
+public interface StatemachineOperationParameter extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Source</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Source</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Source</em>' containment reference.
+	 * @see #setSource(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineOperationParameter_Source()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getSource();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter#getSource <em>Source</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Source</em>' containment reference.
+	 * @see #getSource()
+	 * @generated
+	 */
+	void setSource(StatemachineActionFieldConcatenation value);
+
+} // StatemachineOperationParameter
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePOSPrinterBarcodeType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePOSPrinterBarcodeType.java
new file mode 100644
index 0000000..5699340
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePOSPrinterBarcodeType.java
@@ -0,0 +1,1102 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine POS Printer Barcode Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachinePOSPrinterBarcodeType()
+ * @model
+ * @generated
+ */
+public enum StatemachinePOSPrinterBarcodeType implements Enumerator {
+	/**
+	 * The '<em><b>PTR BCS UPCA</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCA_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCA(0, "PTR_BCS_UPCA", "upca"),
+
+	/**
+	 * The '<em><b>PTR BCS UPCE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCE(0, "PTR_BCS_UPCE", "upcb"),
+
+	/**
+	 * The '<em><b>PTR BCS JAN8</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_JAN8_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_JAN8(0, "PTR_BCS_JAN8", "jan8"),
+
+	/**
+	 * The '<em><b>PTR BCS EAN8</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN8_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_EAN8(0, "PTR_BCS_EAN8", "ean8"),
+
+	/**
+	 * The '<em><b>PTR BCS JAN13</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_JAN13_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_JAN13(0, "PTR_BCS_JAN13", "jan13"),
+
+	/**
+	 * The '<em><b>PTR BCS EAN13</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN13_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_EAN13(0, "PTR_BCS_EAN13", "ean13"),
+
+	/**
+	 * The '<em><b>PTR BCS TF</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_TF_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_TF(0, "PTR_BCS_TF", "tf"),
+
+	/**
+	 * The '<em><b>PTR BCS ITF</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_ITF_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_ITF(0, "PTR_BCS_ITF", "itf"),
+
+	/**
+	 * The '<em><b>PTR BCS Codabar</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODABAR_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_CODABAR(0, "PTR_BCS_Codabar", "codeabar"),
+
+	/**
+	 * The '<em><b>PTR BCS Code39</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODE39_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_CODE39(0, "PTR_BCS_Code39", "code39"),
+
+	/**
+	 * The '<em><b>PTR BCS Code93</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODE93_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_CODE93(0, "PTR_BCS_Code93", "code93"),
+
+	/**
+	 * The '<em><b>PTR BCS Code128</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODE128_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_CODE128(0, "PTR_BCS_Code128", "code128"),
+
+	/**
+	 * The '<em><b>PTR BCS UPCA S</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCA_S_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCA_S(0, "PTR_BCS_UPCA_S", "upca_s"),
+
+	/**
+	 * The '<em><b>PTR BCS UPCE S</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCE_S_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCE_S(0, "PTR_BCS_UPCE_S", "upce_s"),
+
+	/**
+	 * The '<em><b>PTR BCS UPCD1</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD1_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCD1(0, "PTR_BCS_UPCD1", "upcd1"),
+
+	/**
+	 * The '<em><b>PTR BCS UPCD2</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD2_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCD2(0, "PTR_BCS_UPCD2", "upcd2"),
+
+	/**
+	 * The '<em><b>PTR BCS UPCD3</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD3_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCD3(0, "PTR_BCS_UPCD3", "upcd3"),
+
+	/**
+	 * The '<em><b>PTR BCS UPCD4</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD4_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCD4(0, "PTR_BCS_UPCD4", "upcd4"),
+
+	/**
+	 * The '<em><b>PTR BCS UPCD5</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD5_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPCD5(0, "PTR_BCS_UPCD5", "upcd5"),
+
+	/**
+	 * The '<em><b>PTR BCS EAN8 S</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN8_S_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_EAN8_S(0, "PTR_BCS_EAN8_S", "ean8_s"),
+
+	/**
+	 * The '<em><b>PTR BCS EAN13 S</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN13_S_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_EAN13_S(0, "PTR_BCS_EAN13_S", "ean13_s"),
+
+	/**
+	 * The '<em><b>PTR BCS EAN128</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN128_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_EAN128(0, "PTR_BCS_EAN128", "ean128"),
+
+	/**
+	 * The '<em><b>PTR BCS OCRA</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_OCRA_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_OCRA(0, "PTR_BCS_OCRA", "orca"),
+
+	/**
+	 * The '<em><b>PTR BCS OCRB</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_OCRB_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_OCRB(0, "PTR_BCS_OCRB", "ocrb"),
+
+	/**
+	 * The '<em><b>PTR BCS Code128 Parsed</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODE128_PARSED_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_CODE128_PARSED(0, "PTR_BCS_Code128_Parsed", "code128_parsed"),
+
+	/**
+	 * The '<em><b>PTR BCS GS1DATABAR</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_GS1DATABAR_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_GS1DATABAR(0, "PTR_BCS_GS1DATABAR", "gs1databar"),
+
+	/**
+	 * The '<em><b>PTR BCS GS1DATABAR E</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_GS1DATABAR_E_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_GS1DATABAR_E(0, "PTR_BCS_GS1DATABAR_E", "gs1databar_e"),
+
+	/**
+	 * The '<em><b>PTR BCS GS1DATABAR S</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_GS1DATABAR_S_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_GS1DATABAR_S(0, "PTR_BCS_GS1DATABAR_S", "gs1databar_s"),
+
+	/**
+	 * The '<em><b>PTR BCS GS1DATABAR ES</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_GS1DATABAR_ES_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_GS1DATABAR_ES(0, "PTR_BCS_GS1DATABAR_E_S", "gs1databar_e_s"),
+
+	/**
+	 * The '<em><b>PTR BCS PDF417</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_PDF417_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_PDF417(0, "PTR_BCS_PDF417", "pdf417"),
+
+	/**
+	 * The '<em><b>PTR BCS MAXICODE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_MAXICODE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_MAXICODE(0, "PTR_BCS_MAXICODE", "maxicode"),
+
+	/**
+	 * The '<em><b>PTR BCS DATAMATRIX</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_DATAMATRIX_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_DATAMATRIX(0, "PTR_BCS_DATAMATRIX", "datamatrix"),
+
+	/**
+	 * The '<em><b>PTR BCS QRCODE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_QRCODE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_QRCODE(0, "PTR_BCS_QRCODE", "qrcode"),
+
+	/**
+	 * The '<em><b>PTR BCS UQRCODE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UQRCODE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UQRCODE(0, "PTR_BCS_UQRCODE", "uqrcode"),
+
+	/**
+	 * The '<em><b>PTR BCS AZTEC</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_AZTEC_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_AZTEC(0, "PTR_BCS_AZTEC", "aztec"),
+
+	/**
+	 * The '<em><b>PTR BCS UPDF417</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPDF417_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PTR_BCS_UPDF417(0, "PTR_BCS_UPDF417", "updf417");
+
+	/**
+	 * The '<em><b>PTR BCS UPCA</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCA</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCA
+	 * @model literal="upca"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCA_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPCE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCE
+	 * @model literal="upcb"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCE_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS JAN8</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS JAN8</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_JAN8
+	 * @model literal="jan8"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_JAN8_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS EAN8</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS EAN8</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN8
+	 * @model literal="ean8"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_EAN8_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS JAN13</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS JAN13</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_JAN13
+	 * @model literal="jan13"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_JAN13_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS EAN13</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS EAN13</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN13
+	 * @model literal="ean13"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_EAN13_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS TF</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS TF</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_TF
+	 * @model literal="tf"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_TF_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS ITF</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS ITF</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_ITF
+	 * @model literal="itf"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_ITF_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS Codabar</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS Codabar</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODABAR
+	 * @model name="PTR_BCS_Codabar" literal="codeabar"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_CODABAR_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS Code39</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS Code39</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODE39
+	 * @model name="PTR_BCS_Code39" literal="code39"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_CODE39_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS Code93</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS Code93</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODE93
+	 * @model name="PTR_BCS_Code93" literal="code93"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_CODE93_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS Code128</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS Code128</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODE128
+	 * @model name="PTR_BCS_Code128" literal="code128"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_CODE128_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPCA S</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCA S</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCA_S
+	 * @model literal="upca_s"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCA_S_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPCE S</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCE S</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCE_S
+	 * @model literal="upce_s"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCE_S_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPCD1</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCD1</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD1
+	 * @model literal="upcd1"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCD1_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPCD2</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCD2</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD2
+	 * @model literal="upcd2"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCD2_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPCD3</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCD3</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD3
+	 * @model literal="upcd3"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCD3_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPCD4</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCD4</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD4
+	 * @model literal="upcd4"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCD4_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPCD5</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPCD5</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPCD5
+	 * @model literal="upcd5"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPCD5_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS EAN8 S</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS EAN8 S</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN8_S
+	 * @model literal="ean8_s"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_EAN8_S_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS EAN13 S</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS EAN13 S</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN13_S
+	 * @model literal="ean13_s"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_EAN13_S_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS EAN128</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS EAN128</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_EAN128
+	 * @model literal="ean128"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_EAN128_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS OCRA</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS OCRA</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_OCRA
+	 * @model literal="orca"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_OCRA_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS OCRB</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS OCRB</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_OCRB
+	 * @model literal="ocrb"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_OCRB_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS Code128 Parsed</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS Code128 Parsed</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_CODE128_PARSED
+	 * @model name="PTR_BCS_Code128_Parsed" literal="code128_parsed"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_CODE128_PARSED_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS GS1DATABAR</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS GS1DATABAR</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_GS1DATABAR
+	 * @model literal="gs1databar"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_GS1DATABAR_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS GS1DATABAR E</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS GS1DATABAR E</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_GS1DATABAR_E
+	 * @model literal="gs1databar_e"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_GS1DATABAR_E_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS GS1DATABAR S</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS GS1DATABAR S</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_GS1DATABAR_S
+	 * @model literal="gs1databar_s"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_GS1DATABAR_S_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS GS1DATABAR ES</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS GS1DATABAR ES</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_GS1DATABAR_ES
+	 * @model name="PTR_BCS_GS1DATABAR_E_S" literal="gs1databar_e_s"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_GS1DATABAR_ES_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS PDF417</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS PDF417</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_PDF417
+	 * @model literal="pdf417"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_PDF417_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS MAXICODE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS MAXICODE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_MAXICODE
+	 * @model literal="maxicode"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_MAXICODE_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS DATAMATRIX</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS DATAMATRIX</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_DATAMATRIX
+	 * @model literal="datamatrix"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_DATAMATRIX_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS QRCODE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS QRCODE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_QRCODE
+	 * @model literal="qrcode"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_QRCODE_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UQRCODE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UQRCODE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UQRCODE
+	 * @model literal="uqrcode"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UQRCODE_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS AZTEC</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS AZTEC</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_AZTEC
+	 * @model literal="aztec"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_AZTEC_VALUE = 0;
+
+	/**
+	 * The '<em><b>PTR BCS UPDF417</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>PTR BCS UPDF417</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PTR_BCS_UPDF417
+	 * @model literal="updf417"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PTR_BCS_UPDF417_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine POS Printer Barcode Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachinePOSPrinterBarcodeType[] VALUES_ARRAY =
+		new StatemachinePOSPrinterBarcodeType[] {
+			PTR_BCS_UPCA,
+			PTR_BCS_UPCE,
+			PTR_BCS_JAN8,
+			PTR_BCS_EAN8,
+			PTR_BCS_JAN13,
+			PTR_BCS_EAN13,
+			PTR_BCS_TF,
+			PTR_BCS_ITF,
+			PTR_BCS_CODABAR,
+			PTR_BCS_CODE39,
+			PTR_BCS_CODE93,
+			PTR_BCS_CODE128,
+			PTR_BCS_UPCA_S,
+			PTR_BCS_UPCE_S,
+			PTR_BCS_UPCD1,
+			PTR_BCS_UPCD2,
+			PTR_BCS_UPCD3,
+			PTR_BCS_UPCD4,
+			PTR_BCS_UPCD5,
+			PTR_BCS_EAN8_S,
+			PTR_BCS_EAN13_S,
+			PTR_BCS_EAN128,
+			PTR_BCS_OCRA,
+			PTR_BCS_OCRB,
+			PTR_BCS_CODE128_PARSED,
+			PTR_BCS_GS1DATABAR,
+			PTR_BCS_GS1DATABAR_E,
+			PTR_BCS_GS1DATABAR_S,
+			PTR_BCS_GS1DATABAR_ES,
+			PTR_BCS_PDF417,
+			PTR_BCS_MAXICODE,
+			PTR_BCS_DATAMATRIX,
+			PTR_BCS_QRCODE,
+			PTR_BCS_UQRCODE,
+			PTR_BCS_AZTEC,
+			PTR_BCS_UPDF417,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine POS Printer Barcode Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachinePOSPrinterBarcodeType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine POS Printer Barcode Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachinePOSPrinterBarcodeType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachinePOSPrinterBarcodeType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine POS Printer Barcode Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachinePOSPrinterBarcodeType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachinePOSPrinterBarcodeType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine POS Printer Barcode Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachinePOSPrinterBarcodeType get(int value) {
+		switch (value) {
+			case PTR_BCS_UPCA_VALUE: return PTR_BCS_UPCA;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachinePOSPrinterBarcodeType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachinePOSPrinterBarcodeType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePackage.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePackage.java
new file mode 100644
index 0000000..084ca71
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePackage.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.osbp.dsl.semantic.common.types.LPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Package</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachinePackage#getStatemachines <em>Statemachines</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachinePackage()
+ * @model
+ * @generated
+ */
+public interface StatemachinePackage extends LPackage {
+	/**
+	 * Returns the value of the '<em><b>Statemachines</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.Statemachine}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Statemachines</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Statemachines</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachinePackage_Statemachines()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Statemachine> getStatemachines();
+
+} // StatemachinePackage
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevice.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevice.java
new file mode 100644
index 0000000..6a949e8
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevice.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Peripheral Device</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachinePeripheralDevice()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface StatemachinePeripheralDevice extends StatemachineBase {
+} // StatemachinePeripheralDevice
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDeviceCashDrawer.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDeviceCashDrawer.java
new file mode 100644
index 0000000..a0421d9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDeviceCashDrawer.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Peripheral Device Cash Drawer</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachinePeripheralDeviceCashDrawer()
+ * @model
+ * @generated
+ */
+public interface StatemachinePeripheralDeviceCashDrawer extends StatemachinePeripheralDevice {
+} // StatemachinePeripheralDeviceCashDrawer
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDeviceLineDisplay.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDeviceLineDisplay.java
new file mode 100644
index 0000000..a5992b2
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDeviceLineDisplay.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Peripheral Device Line Display</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachinePeripheralDeviceLineDisplay()
+ * @model
+ * @generated
+ */
+public interface StatemachinePeripheralDeviceLineDisplay extends StatemachinePeripheralDevice {
+} // StatemachinePeripheralDeviceLineDisplay
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevicePOSPrinter.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevicePOSPrinter.java
new file mode 100644
index 0000000..6a8f4f0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevicePOSPrinter.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Peripheral Device POS Printer</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachinePeripheralDevicePOSPrinter()
+ * @model
+ * @generated
+ */
+public interface StatemachinePeripheralDevicePOSPrinter extends StatemachinePeripheralDevice {
+} // StatemachinePeripheralDevicePOSPrinter
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevicePT.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevicePT.java
new file mode 100644
index 0000000..83354bd
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachinePeripheralDevicePT.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Peripheral Device PT</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachinePeripheralDevicePT()
+ * @model
+ * @generated
+ */
+public interface StatemachinePeripheralDevicePT extends StatemachinePeripheralDevice {
+} // StatemachinePeripheralDevicePT
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineState.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineState.java
new file mode 100644
index 0000000..7fb8b12
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineState.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine State</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getTriggers <em>Triggers</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getIdentity <em>Identity</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getKeystroke <em>Keystroke</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#isHasKeyOperation <em>Has Key Operation</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getKeyOperation <em>Key Operation</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineState()
+ * @model
+ * @generated
+ */
+public interface StatemachineState extends StatemachineBase {
+	/**
+	 * Returns the value of the '<em><b>Triggers</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Triggers</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Triggers</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineState_Triggers()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineTrigger> getTriggers();
+
+	/**
+	 * Returns the value of the '<em><b>Identity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Identity</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Identity</em>' containment reference.
+	 * @see #setIdentity(StatemachineOperation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineState_Identity()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineOperation getIdentity();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getIdentity <em>Identity</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Identity</em>' containment reference.
+	 * @see #getIdentity()
+	 * @generated
+	 */
+	void setIdentity(StatemachineOperation value);
+
+	/**
+	 * Returns the value of the '<em><b>Keystroke</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Keystroke</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Keystroke</em>' reference.
+	 * @see #setKeystroke(StatemachineControlFieldAttribute)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineState_Keystroke()
+	 * @model
+	 * @generated
+	 */
+	StatemachineControlFieldAttribute getKeystroke();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getKeystroke <em>Keystroke</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Keystroke</em>' reference.
+	 * @see #getKeystroke()
+	 * @generated
+	 */
+	void setKeystroke(StatemachineControlFieldAttribute value);
+
+	/**
+	 * Returns the value of the '<em><b>Has Key Operation</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Has Key Operation</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Has Key Operation</em>' attribute.
+	 * @see #setHasKeyOperation(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineState_HasKeyOperation()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isHasKeyOperation();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#isHasKeyOperation <em>Has Key Operation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Has Key Operation</em>' attribute.
+	 * @see #isHasKeyOperation()
+	 * @generated
+	 */
+	void setHasKeyOperation(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Key Operation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Key Operation</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Key Operation</em>' containment reference.
+	 * @see #setKeyOperation(StatemachineOperation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineState_KeyOperation()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineOperation getKeyOperation();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState#getKeyOperation <em>Key Operation</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Key Operation</em>' containment reference.
+	 * @see #getKeyOperation()
+	 * @generated
+	 */
+	void setKeyOperation(StatemachineOperation value);
+
+} // StatemachineState
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineStorage.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineStorage.java
new file mode 100644
index 0000000..f595d26
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineStorage.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Storage</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getContent <em>Content</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineStorage()
+ * @model
+ * @generated
+ */
+public interface StatemachineStorage extends StatemachineAction {
+	/**
+	 * Returns the value of the '<em><b>Key</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Key</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Key</em>' attribute.
+	 * @see #setKey(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineStorage_Key()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getKey();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getKey <em>Key</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Key</em>' attribute.
+	 * @see #getKey()
+	 * @generated
+	 */
+	void setKey(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' attribute.
+	 * @see #setAttribute(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineStorage_Attribute()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getAttribute <em>Attribute</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' attribute.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Content</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Content</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Content</em>' containment reference.
+	 * @see #setContent(StatemachineActionFieldConcatenation)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineStorage_Content()
+	 * @model containment="true"
+	 * @generated
+	 */
+	StatemachineActionFieldConcatenation getContent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage#getContent <em>Content</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Content</em>' containment reference.
+	 * @see #getContent()
+	 * @generated
+	 */
+	void setContent(StatemachineActionFieldConcatenation value);
+
+} // StatemachineStorage
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineStorageRetrieve.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineStorageRetrieve.java
new file mode 100644
index 0000000..f273984
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineStorageRetrieve.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Storage Retrieve</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve#getKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineStorageRetrieve()
+ * @model
+ * @generated
+ */
+public interface StatemachineStorageRetrieve extends StatemachineActionFieldSource {
+	/**
+	 * Returns the value of the '<em><b>Key</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Key</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Key</em>' attribute.
+	 * @see #setKey(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineStorageRetrieve_Key()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getKey();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve#getKey <em>Key</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Key</em>' attribute.
+	 * @see #getKey()
+	 * @generated
+	 */
+	void setKey(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' attribute.
+	 * @see #setAttribute(String)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineStorageRetrieve_Attribute()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve#getAttribute <em>Attribute</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' attribute.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(String value);
+
+} // StatemachineStorageRetrieve
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineTrigger.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineTrigger.java
new file mode 100644
index 0000000..71d0bd8
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineTrigger.java
@@ -0,0 +1,139 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine Trigger</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#isHasTransition <em>Has Transition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getTransition <em>Transition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getTriggers <em>Triggers</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getGuards <em>Guards</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getActions <em>Actions</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineTrigger()
+ * @model
+ * @generated
+ */
+public interface StatemachineTrigger extends StatemachineLazyResolver {
+	/**
+	 * Returns the value of the '<em><b>Has Transition</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Has Transition</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Has Transition</em>' attribute.
+	 * @see #setHasTransition(boolean)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineTrigger_HasTransition()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isHasTransition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#isHasTransition <em>Has Transition</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Has Transition</em>' attribute.
+	 * @see #isHasTransition()
+	 * @generated
+	 */
+	void setHasTransition(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Transition</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Transition</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Transition</em>' reference.
+	 * @see #setTransition(StatemachineState)
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineTrigger_Transition()
+	 * @model
+	 * @generated
+	 */
+	StatemachineState getTransition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger#getTransition <em>Transition</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Transition</em>' reference.
+	 * @see #getTransition()
+	 * @generated
+	 */
+	void setTransition(StatemachineState value);
+
+	/**
+	 * Returns the value of the '<em><b>Triggers</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineEvent}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Triggers</em>' reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Triggers</em>' reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineTrigger_Triggers()
+	 * @model
+	 * @generated
+	 */
+	EList<StatemachineEvent> getTriggers();
+
+	/**
+	 * Returns the value of the '<em><b>Guards</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Guards</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Guards</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineTrigger_Guards()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineGuard> getGuards();
+
+	/**
+	 * Returns the value of the '<em><b>Actions</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.statemachine.StatemachineAction}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Actions</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Actions</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineTrigger_Actions()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<StatemachineAction> getActions();
+
+} // StatemachineTrigger
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineUserMessageType.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineUserMessageType.java
new file mode 100644
index 0000000..c4a0ab2
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/StatemachineUserMessageType.java
@@ -0,0 +1,296 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Statemachine User Message Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#getStatemachineUserMessageType()
+ * @model
+ * @generated
+ */
+public enum StatemachineUserMessageType implements Enumerator {
+	/**
+	 * The '<em><b>HUMANIZED MESSAGE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #HUMANIZED_MESSAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	HUMANIZED_MESSAGE(0, "HUMANIZED_MESSAGE", "humanized"),
+
+	/**
+	 * The '<em><b>WARNING MESSAGE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #WARNING_MESSAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	WARNING_MESSAGE(0, "WARNING_MESSAGE", "warning"),
+
+	/**
+	 * The '<em><b>ERROR MESSAGE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ERROR_MESSAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ERROR_MESSAGE(0, "ERROR_MESSAGE", "error"),
+
+	/**
+	 * The '<em><b>TRAY NOTIFICATION</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #TRAY_NOTIFICATION_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	TRAY_NOTIFICATION(0, "TRAY_NOTIFICATION", "tray"),
+
+	/**
+	 * The '<em><b>ASSISTIVE NOTIFICATION</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASSISTIVE_NOTIFICATION_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ASSISTIVE_NOTIFICATION(0, "ASSISTIVE_NOTIFICATION", "assistive");
+
+	/**
+	 * The '<em><b>HUMANIZED MESSAGE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>HUMANIZED MESSAGE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #HUMANIZED_MESSAGE
+	 * @model literal="humanized"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int HUMANIZED_MESSAGE_VALUE = 0;
+
+	/**
+	 * The '<em><b>WARNING MESSAGE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>WARNING MESSAGE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #WARNING_MESSAGE
+	 * @model literal="warning"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int WARNING_MESSAGE_VALUE = 0;
+
+	/**
+	 * The '<em><b>ERROR MESSAGE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>ERROR MESSAGE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ERROR_MESSAGE
+	 * @model literal="error"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ERROR_MESSAGE_VALUE = 0;
+
+	/**
+	 * The '<em><b>TRAY NOTIFICATION</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>TRAY NOTIFICATION</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #TRAY_NOTIFICATION
+	 * @model literal="tray"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int TRAY_NOTIFICATION_VALUE = 0;
+
+	/**
+	 * The '<em><b>ASSISTIVE NOTIFICATION</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>ASSISTIVE NOTIFICATION</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ASSISTIVE_NOTIFICATION
+	 * @model literal="assistive"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ASSISTIVE_NOTIFICATION_VALUE = 0;
+
+	/**
+	 * An array of all the '<em><b>Statemachine User Message Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final StatemachineUserMessageType[] VALUES_ARRAY =
+		new StatemachineUserMessageType[] {
+			HUMANIZED_MESSAGE,
+			WARNING_MESSAGE,
+			ERROR_MESSAGE,
+			TRAY_NOTIFICATION,
+			ASSISTIVE_NOTIFICATION,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Statemachine User Message Type</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<StatemachineUserMessageType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Statemachine User Message Type</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineUserMessageType get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineUserMessageType result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine User Message Type</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineUserMessageType getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			StatemachineUserMessageType result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Statemachine User Message Type</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineUserMessageType get(int value) {
+		switch (value) {
+			case HUMANIZED_MESSAGE_VALUE: return HUMANIZED_MESSAGE;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private StatemachineUserMessageType(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //StatemachineUserMessageType
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionButtonCaptionImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionButtonCaptionImpl.java
new file mode 100644
index 0000000..18984c5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionButtonCaptionImpl.java
@@ -0,0 +1,247 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Button Caption</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonCaptionImpl#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonCaptionImpl#getCaption <em>Caption</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionButtonCaptionImpl extends StatemachineLazyResolverImpl implements StatemachineActionButtonCaption {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlButtonAttribute attribute;
+
+	/**
+	 * The cached value of the '{@link #getCaption() <em>Caption</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCaption()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation caption;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionButtonCaptionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_CAPTION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlButtonAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlButtonAttribute newAttribute) {
+		StatemachineControlButtonAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getCaption() {
+		return caption;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetCaption(StatemachineActionFieldConcatenation newCaption, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldCaption = caption;
+		caption = newCaption;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION, oldCaption, newCaption);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCaption(StatemachineActionFieldConcatenation newCaption) {
+		if (newCaption != caption) {
+			NotificationChain msgs = null;
+			if (caption != null)
+				msgs = ((InternalEObject)caption).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION, null, msgs);
+			if (newCaption != null)
+				msgs = ((InternalEObject)newCaption).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION, null, msgs);
+			msgs = basicSetCaption(newCaption, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION, newCaption, newCaption));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION:
+				return basicSetCaption(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION:
+				return getCaption();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE:
+				setAttribute((StatemachineControlButtonAttribute)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION:
+				setCaption((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE:
+				setAttribute((StatemachineControlButtonAttribute)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION:
+				setCaption((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE:
+				return attribute != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION:
+				return caption != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionButtonCaptionImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionButtonImageImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionButtonImageImpl.java
new file mode 100644
index 0000000..b023cba
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionButtonImageImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Button Image</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonImageImpl#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionButtonImageImpl#getImage <em>Image</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionButtonImageImpl extends StatemachineLazyResolverImpl implements StatemachineActionButtonImage {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlButtonAttribute attribute;
+
+	/**
+	 * The default value of the '{@link #getImage() <em>Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getImage()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String IMAGE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getImage() <em>Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getImage()
+	 * @generated
+	 * @ordered
+	 */
+	protected String image = IMAGE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionButtonImageImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_IMAGE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlButtonAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlButtonAttribute newAttribute) {
+		StatemachineControlButtonAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getImage() {
+		return image;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setImage(String newImage) {
+		String oldImage = image;
+		image = newImage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE, oldImage, image));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE:
+				return getImage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE:
+				setAttribute((StatemachineControlButtonAttribute)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE:
+				setImage((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE:
+				setAttribute((StatemachineControlButtonAttribute)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE:
+				setImage(IMAGE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE:
+				return attribute != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE:
+				return IMAGE_EDEFAULT == null ? image != null : !IMAGE_EDEFAULT.equals(image);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (image: ");
+		result.append(image);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionButtonImageImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionConditionalTransitionImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionConditionalTransitionImpl.java
new file mode 100644
index 0000000..c8be7ec
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionConditionalTransitionImpl.java
@@ -0,0 +1,292 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineAction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineGuard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineState;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Conditional Transition</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionConditionalTransitionImpl#getTransition <em>Transition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionConditionalTransitionImpl#getGuard <em>Guard</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionConditionalTransitionImpl#getActions <em>Actions</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionConditionalTransitionImpl extends StatemachineLazyResolverImpl implements StatemachineActionConditionalTransition {
+	/**
+	 * The cached value of the '{@link #getTransition() <em>Transition</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTransition()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineState transition;
+
+	/**
+	 * The cached value of the '{@link #getGuard() <em>Guard</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getGuard()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineGuard guard;
+
+	/**
+	 * The cached value of the '{@link #getActions() <em>Actions</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getActions()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineAction> actions;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionConditionalTransitionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineState getTransition() {
+		if (transition != null && transition.eIsProxy()) {
+			InternalEObject oldTransition = (InternalEObject)transition;
+			transition = (StatemachineState)eResolveProxy(oldTransition);
+			if (transition != oldTransition) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION, oldTransition, transition));
+			}
+		}
+		return transition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineState basicGetTransition() {
+		return transition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTransition(StatemachineState newTransition) {
+		StatemachineState oldTransition = transition;
+		transition = newTransition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION, oldTransition, transition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineGuard getGuard() {
+		return guard;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetGuard(StatemachineGuard newGuard, NotificationChain msgs) {
+		StatemachineGuard oldGuard = guard;
+		guard = newGuard;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD, oldGuard, newGuard);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setGuard(StatemachineGuard newGuard) {
+		if (newGuard != guard) {
+			NotificationChain msgs = null;
+			if (guard != null)
+				msgs = ((InternalEObject)guard).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD, null, msgs);
+			if (newGuard != null)
+				msgs = ((InternalEObject)newGuard).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD, null, msgs);
+			msgs = basicSetGuard(newGuard, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD, newGuard, newGuard));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineAction> getActions() {
+		if (actions == null) {
+			actions = new EObjectContainmentEList<StatemachineAction>(StatemachineAction.class, this, StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS);
+		}
+		return actions;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD:
+				return basicSetGuard(null, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS:
+				return ((InternalEList<?>)getActions()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION:
+				if (resolve) return getTransition();
+				return basicGetTransition();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD:
+				return getGuard();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS:
+				return getActions();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION:
+				setTransition((StatemachineState)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD:
+				setGuard((StatemachineGuard)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS:
+				getActions().clear();
+				getActions().addAll((Collection<? extends StatemachineAction>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION:
+				setTransition((StatemachineState)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD:
+				setGuard((StatemachineGuard)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS:
+				getActions().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION:
+				return transition != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD:
+				return guard != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS:
+				return actions != null && !actions.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionConditionalTransitionImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionDTOFindImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionDTOFindImpl.java
new file mode 100644
index 0000000..b93a738
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionDTOFindImpl.java
@@ -0,0 +1,309 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action DTO Find</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionDTOFindImpl#getDto <em>Dto</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionDTOFindImpl#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionDTOFindImpl#getSearch <em>Search</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionDTOFindImpl extends StatemachineLazyResolverImpl implements StatemachineActionDTOFind {
+	/**
+	 * The cached value of the '{@link #getDto() <em>Dto</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDto()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlDTOAttribute dto;
+
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected LDtoInheritedAttribute attribute;
+
+	/**
+	 * The cached value of the '{@link #getSearch() <em>Search</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSearch()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation search;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionDTOFindImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlDTOAttribute getDto() {
+		if (dto != null && dto.eIsProxy()) {
+			InternalEObject oldDto = (InternalEObject)dto;
+			dto = (StatemachineControlDTOAttribute)eResolveProxy(oldDto);
+			if (dto != oldDto) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__DTO, oldDto, dto));
+			}
+		}
+		return dto;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlDTOAttribute basicGetDto() {
+		return dto;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDto(StatemachineControlDTOAttribute newDto) {
+		StatemachineControlDTOAttribute oldDto = dto;
+		dto = newDto;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__DTO, oldDto, dto));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LDtoInheritedAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (LDtoInheritedAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LDtoInheritedAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(LDtoInheritedAttribute newAttribute) {
+		LDtoInheritedAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getSearch() {
+		return search;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSearch(StatemachineActionFieldConcatenation newSearch, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldSearch = search;
+		search = newSearch;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH, oldSearch, newSearch);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSearch(StatemachineActionFieldConcatenation newSearch) {
+		if (newSearch != search) {
+			NotificationChain msgs = null;
+			if (search != null)
+				msgs = ((InternalEObject)search).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH, null, msgs);
+			if (newSearch != null)
+				msgs = ((InternalEObject)newSearch).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH, null, msgs);
+			msgs = basicSetSearch(newSearch, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH, newSearch, newSearch));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH:
+				return basicSetSearch(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__DTO:
+				if (resolve) return getDto();
+				return basicGetDto();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH:
+				return getSearch();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__DTO:
+				setDto((StatemachineControlDTOAttribute)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE:
+				setAttribute((LDtoInheritedAttribute)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH:
+				setSearch((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__DTO:
+				setDto((StatemachineControlDTOAttribute)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE:
+				setAttribute((LDtoInheritedAttribute)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH:
+				setSearch((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__DTO:
+				return dto != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE:
+				return attribute != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND__SEARCH:
+				return search != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionDTOFindImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldClearImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldClearImpl.java
new file mode 100644
index 0000000..565428f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldClearImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Clear</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldClearImpl#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldClearImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldClear {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlFieldAttribute attribute;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldClearImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_CLEAR;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlFieldAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlFieldAttribute newAttribute) {
+		StatemachineControlFieldAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE:
+				return attribute != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionFieldClearImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldConcatenationImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldConcatenationImpl.java
new file mode 100644
index 0000000..caea202
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldConcatenationImpl.java
@@ -0,0 +1,230 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Concatenation</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldConcatenationImpl#getFirst <em>First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldConcatenationImpl#getMore <em>More</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldConcatenationImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldConcatenation {
+	/**
+	 * The cached value of the '{@link #getFirst() <em>First</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFirst()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldSource first;
+
+	/**
+	 * The cached value of the '{@link #getMore() <em>More</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMore()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineActionFieldSource> more;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldConcatenationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_CONCATENATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldSource getFirst() {
+		return first;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetFirst(StatemachineActionFieldSource newFirst, NotificationChain msgs) {
+		StatemachineActionFieldSource oldFirst = first;
+		first = newFirst;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST, oldFirst, newFirst);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFirst(StatemachineActionFieldSource newFirst) {
+		if (newFirst != first) {
+			NotificationChain msgs = null;
+			if (first != null)
+				msgs = ((InternalEObject)first).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST, null, msgs);
+			if (newFirst != null)
+				msgs = ((InternalEObject)newFirst).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST, null, msgs);
+			msgs = basicSetFirst(newFirst, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST, newFirst, newFirst));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineActionFieldSource> getMore() {
+		if (more == null) {
+			more = new EObjectContainmentEList<StatemachineActionFieldSource>(StatemachineActionFieldSource.class, this, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE);
+		}
+		return more;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST:
+				return basicSetFirst(null, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE:
+				return ((InternalEList<?>)getMore()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST:
+				return getFirst();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE:
+				return getMore();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST:
+				setFirst((StatemachineActionFieldSource)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE:
+				getMore().clear();
+				getMore().addAll((Collection<? extends StatemachineActionFieldSource>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST:
+				setFirst((StatemachineActionFieldSource)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE:
+				getMore().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST:
+				return first != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE:
+				return more != null && !more.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionFieldConcatenationImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldGetImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldGetImpl.java
new file mode 100644
index 0000000..cb3dc5a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldGetImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Get</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldGetImpl#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldGetImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldGet {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlFieldAttribute attribute;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldGetImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_GET;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlFieldAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlFieldAttribute newAttribute) {
+		StatemachineControlFieldAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE:
+				return attribute != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionFieldGetImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldKeystrokeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldKeystrokeImpl.java
new file mode 100644
index 0000000..95c9409
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldKeystrokeImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Keystroke</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldKeystrokeImpl#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldKeystrokeImpl#getKeystroke <em>Keystroke</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldKeystrokeImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldKeystroke {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlFieldAttribute attribute;
+
+	/**
+	 * The default value of the '{@link #getKeystroke() <em>Keystroke</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKeystroke()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String KEYSTROKE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getKeystroke() <em>Keystroke</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKeystroke()
+	 * @generated
+	 * @ordered
+	 */
+	protected String keystroke = KEYSTROKE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldKeystrokeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_KEYSTROKE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlFieldAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlFieldAttribute newAttribute) {
+		StatemachineControlFieldAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getKeystroke() {
+		return keystroke;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKeystroke(String newKeystroke) {
+		String oldKeystroke = keystroke;
+		keystroke = newKeystroke;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__KEYSTROKE, oldKeystroke, keystroke));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__KEYSTROKE:
+				return getKeystroke();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__KEYSTROKE:
+				setKeystroke((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__KEYSTROKE:
+				setKeystroke(KEYSTROKE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE:
+				return attribute != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE__KEYSTROKE:
+				return KEYSTROKE_EDEFAULT == null ? keystroke != null : !KEYSTROKE_EDEFAULT.equals(keystroke);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (keystroke: ");
+		result.append(keystroke);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionFieldKeystrokeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldRemoveImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldRemoveImpl.java
new file mode 100644
index 0000000..0f99749
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldRemoveImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Remove</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldRemoveImpl#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldRemoveImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldRemove {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlFieldAttribute attribute;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldRemoveImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_REMOVE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlFieldAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlFieldAttribute newAttribute) {
+		StatemachineControlFieldAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE:
+				return attribute != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionFieldRemoveImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSetImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSetImpl.java
new file mode 100644
index 0000000..660e542
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSetImpl.java
@@ -0,0 +1,247 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Set</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSetImpl#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSetImpl#getSource <em>Source</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldSetImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldSet {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlFieldAttribute attribute;
+
+	/**
+	 * The cached value of the '{@link #getSource() <em>Source</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSource()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation source;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldSetImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SET;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlFieldAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlFieldAttribute newAttribute) {
+		StatemachineControlFieldAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getSource() {
+		return source;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSource(StatemachineActionFieldConcatenation newSource, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldSource = source;
+		source = newSource;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE, oldSource, newSource);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSource(StatemachineActionFieldConcatenation newSource) {
+		if (newSource != source) {
+			NotificationChain msgs = null;
+			if (source != null)
+				msgs = ((InternalEObject)source).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE, null, msgs);
+			if (newSource != null)
+				msgs = ((InternalEObject)newSource).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE, null, msgs);
+			msgs = basicSetSource(newSource, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE, newSource, newSource));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE:
+				return basicSetSource(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE:
+				return getSource();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE:
+				setSource((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE:
+				setAttribute((StatemachineControlFieldAttribute)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE:
+				setSource((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE:
+				return attribute != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET__SOURCE:
+				return source != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionFieldSetImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceDtoAttributeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceDtoAttributeImpl.java
new file mode 100644
index 0000000..7492f0d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceDtoAttributeImpl.java
@@ -0,0 +1,229 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Source Dto Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceDtoAttributeImpl#getDto <em>Dto</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceDtoAttributeImpl#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldSourceDtoAttributeImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldSourceDtoAttribute {
+	/**
+	 * The cached value of the '{@link #getDto() <em>Dto</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDto()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlDTOAttribute dto;
+
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected LDtoInheritedAttribute attribute;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldSourceDtoAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlDTOAttribute getDto() {
+		if (dto != null && dto.eIsProxy()) {
+			InternalEObject oldDto = (InternalEObject)dto;
+			dto = (StatemachineControlDTOAttribute)eResolveProxy(oldDto);
+			if (dto != oldDto) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO, oldDto, dto));
+			}
+		}
+		return dto;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlDTOAttribute basicGetDto() {
+		return dto;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDto(StatemachineControlDTOAttribute newDto) {
+		StatemachineControlDTOAttribute oldDto = dto;
+		dto = newDto;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO, oldDto, dto));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LDtoInheritedAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (LDtoInheritedAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LDtoInheritedAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(LDtoInheritedAttribute newAttribute) {
+		LDtoInheritedAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO:
+				if (resolve) return getDto();
+				return basicGetDto();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO:
+				setDto((StatemachineControlDTOAttribute)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE:
+				setAttribute((LDtoInheritedAttribute)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO:
+				setDto((StatemachineControlDTOAttribute)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE:
+				setAttribute((LDtoInheritedAttribute)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO:
+				return dto != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE:
+				return attribute != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionFieldSourceDtoAttributeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceEvaluateImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceEvaluateImpl.java
new file mode 100644
index 0000000..d864ea6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceEvaluateImpl.java
@@ -0,0 +1,174 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Source Evaluate</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceEvaluateImpl#getEvaluationtype <em>Evaluationtype</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldSourceEvaluateImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldSourceEvaluate {
+	/**
+	 * The default value of the '{@link #getEvaluationtype() <em>Evaluationtype</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEvaluationtype()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineEvaluationType EVALUATIONTYPE_EDEFAULT = StatemachineEvaluationType.IP_ADDRESS;
+
+	/**
+	 * The cached value of the '{@link #getEvaluationtype() <em>Evaluationtype</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEvaluationtype()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineEvaluationType evaluationtype = EVALUATIONTYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldSourceEvaluateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvaluationType getEvaluationtype() {
+		return evaluationtype;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEvaluationtype(StatemachineEvaluationType newEvaluationtype) {
+		StatemachineEvaluationType oldEvaluationtype = evaluationtype;
+		evaluationtype = newEvaluationtype == null ? EVALUATIONTYPE_EDEFAULT : newEvaluationtype;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE, oldEvaluationtype, evaluationtype));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE:
+				return getEvaluationtype();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE:
+				setEvaluationtype((StatemachineEvaluationType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE:
+				setEvaluationtype(EVALUATIONTYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE:
+				return evaluationtype != EVALUATIONTYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (evaluationtype: ");
+		result.append(evaluationtype);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionFieldSourceEvaluateImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceEventImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceEventImpl.java
new file mode 100644
index 0000000..e5e5746
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceEventImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Source Event</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldSourceEventImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldSourceEvent {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldSourceEventImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_EVENT;
+	}
+
+} //StatemachineActionFieldSourceEventImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceNumberImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceNumberImpl.java
new file mode 100644
index 0000000..4ac2dc8
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceNumberImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Source Number</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceNumberImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldSourceNumberImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldSourceNumber {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final Double VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Double value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldSourceNumberImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Double getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(Double newValue) {
+		Double oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE:
+				setValue((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionFieldSourceNumberImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceStringImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceStringImpl.java
new file mode 100644
index 0000000..90134c4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceStringImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Source String</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceStringImpl#getText <em>Text</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldSourceStringImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldSourceString {
+	/**
+	 * The default value of the '{@link #getText() <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String TEXT_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getText() <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected String text = TEXT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldSourceStringImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_STRING;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setText(String newText) {
+		String oldText = text;
+		text = newText;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT, oldText, text));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT:
+				return getText();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT:
+				setText((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT:
+				setText(TEXT_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT:
+				return TEXT_EDEFAULT == null ? text != null : !TEXT_EDEFAULT.equals(text);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (text: ");
+		result.append(text);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionFieldSourceStringImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceTranslateImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceTranslateImpl.java
new file mode 100644
index 0000000..8d53b33
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionFieldSourceTranslateImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Field Source Translate</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionFieldSourceTranslateImpl#getText <em>Text</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionFieldSourceTranslateImpl extends StatemachineLazyResolverImpl implements StatemachineActionFieldSourceTranslate {
+	/**
+	 * The default value of the '{@link #getText() <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String TEXT_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getText() <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected String text = TEXT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionFieldSourceTranslateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setText(String newText) {
+		String oldText = text;
+		text = newText;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT, oldText, text));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT:
+				return getText();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT:
+				setText((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT:
+				setText(TEXT_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT:
+				return TEXT_EDEFAULT == null ? text != null : !TEXT_EDEFAULT.equals(text);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (text: ");
+		result.append(text);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionFieldSourceTranslateImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionItemInvisibleImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionItemInvisibleImpl.java
new file mode 100644
index 0000000..ea935cf
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionItemInvisibleImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Item Invisible</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemInvisibleImpl#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionItemInvisibleImpl extends StatemachineLazyResolverImpl implements StatemachineActionItemInvisible {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlVisibility attribute;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionItemInvisibleImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_INVISIBLE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlVisibility getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlVisibility)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlVisibility basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlVisibility newAttribute) {
+		StatemachineControlVisibility oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE:
+				setAttribute((StatemachineControlVisibility)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE:
+				setAttribute((StatemachineControlVisibility)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE:
+				return attribute != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionItemInvisibleImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionItemVisibleImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionItemVisibleImpl.java
new file mode 100644
index 0000000..8e56125
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionItemVisibleImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Item Visible</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionItemVisibleImpl#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionItemVisibleImpl extends StatemachineLazyResolverImpl implements StatemachineActionItemVisible {
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlVisibility attribute;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionItemVisibleImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_VISIBLE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlVisibility getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (StatemachineControlVisibility)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlVisibility basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(StatemachineControlVisibility newAttribute) {
+		StatemachineControlVisibility oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE:
+				setAttribute((StatemachineControlVisibility)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE:
+				setAttribute((StatemachineControlVisibility)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE:
+				return attribute != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionItemVisibleImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralBlinkRateImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralBlinkRateImpl.java
new file mode 100644
index 0000000..e4ec0b2
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralBlinkRateImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Blink Rate</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralBlinkRateImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralBlinkRateImpl#getBlinkRate <em>Blink Rate</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralBlinkRateImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralBlinkRate {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getBlinkRate() <em>Blink Rate</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBlinkRate()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int BLINK_RATE_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getBlinkRate() <em>Blink Rate</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBlinkRate()
+	 * @generated
+	 * @ordered
+	 */
+	protected int blinkRate = BLINK_RATE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralBlinkRateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getBlinkRate() {
+		return blinkRate;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBlinkRate(int newBlinkRate) {
+		int oldBlinkRate = blinkRate;
+		blinkRate = newBlinkRate;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE, oldBlinkRate, blinkRate));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE:
+				return getBlinkRate();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE:
+				setBlinkRate((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE:
+				setBlinkRate(BLINK_RATE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE:
+				return blinkRate != BLINK_RATE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (blinkRate: ");
+		result.append(blinkRate);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralBlinkRateImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralClearImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralClearImpl.java
new file mode 100644
index 0000000..f3d614a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralClearImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Clear</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralClearImpl#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralClearImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralClear {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralClearImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CLEAR;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE:
+				return device != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralClearImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralCreateWindowImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralCreateWindowImpl.java
new file mode 100644
index 0000000..1cb05b0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralCreateWindowImpl.java
@@ -0,0 +1,505 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Create Window</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl#getViewportRow <em>Viewport Row</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl#getViewportColumn <em>Viewport Column</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl#getViewportHeight <em>Viewport Height</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl#getViewportWidth <em>Viewport Width</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl#getWindowHeight <em>Window Height</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCreateWindowImpl#getWindowWidth <em>Window Width</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralCreateWindowImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralCreateWindow {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getViewportRow() <em>Viewport Row</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getViewportRow()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int VIEWPORT_ROW_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getViewportRow() <em>Viewport Row</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getViewportRow()
+	 * @generated
+	 * @ordered
+	 */
+	protected int viewportRow = VIEWPORT_ROW_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getViewportColumn() <em>Viewport Column</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getViewportColumn()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int VIEWPORT_COLUMN_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getViewportColumn() <em>Viewport Column</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getViewportColumn()
+	 * @generated
+	 * @ordered
+	 */
+	protected int viewportColumn = VIEWPORT_COLUMN_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getViewportHeight() <em>Viewport Height</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getViewportHeight()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int VIEWPORT_HEIGHT_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getViewportHeight() <em>Viewport Height</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getViewportHeight()
+	 * @generated
+	 * @ordered
+	 */
+	protected int viewportHeight = VIEWPORT_HEIGHT_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getViewportWidth() <em>Viewport Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getViewportWidth()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int VIEWPORT_WIDTH_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getViewportWidth() <em>Viewport Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getViewportWidth()
+	 * @generated
+	 * @ordered
+	 */
+	protected int viewportWidth = VIEWPORT_WIDTH_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getWindowHeight() <em>Window Height</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWindowHeight()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int WINDOW_HEIGHT_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getWindowHeight() <em>Window Height</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWindowHeight()
+	 * @generated
+	 * @ordered
+	 */
+	protected int windowHeight = WINDOW_HEIGHT_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getWindowWidth() <em>Window Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWindowWidth()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int WINDOW_WIDTH_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getWindowWidth() <em>Window Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWindowWidth()
+	 * @generated
+	 * @ordered
+	 */
+	protected int windowWidth = WINDOW_WIDTH_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralCreateWindowImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getViewportRow() {
+		return viewportRow;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setViewportRow(int newViewportRow) {
+		int oldViewportRow = viewportRow;
+		viewportRow = newViewportRow;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW, oldViewportRow, viewportRow));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getViewportColumn() {
+		return viewportColumn;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setViewportColumn(int newViewportColumn) {
+		int oldViewportColumn = viewportColumn;
+		viewportColumn = newViewportColumn;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN, oldViewportColumn, viewportColumn));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getViewportHeight() {
+		return viewportHeight;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setViewportHeight(int newViewportHeight) {
+		int oldViewportHeight = viewportHeight;
+		viewportHeight = newViewportHeight;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT, oldViewportHeight, viewportHeight));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getViewportWidth() {
+		return viewportWidth;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setViewportWidth(int newViewportWidth) {
+		int oldViewportWidth = viewportWidth;
+		viewportWidth = newViewportWidth;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH, oldViewportWidth, viewportWidth));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getWindowHeight() {
+		return windowHeight;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setWindowHeight(int newWindowHeight) {
+		int oldWindowHeight = windowHeight;
+		windowHeight = newWindowHeight;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT, oldWindowHeight, windowHeight));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getWindowWidth() {
+		return windowWidth;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setWindowWidth(int newWindowWidth) {
+		int oldWindowWidth = windowWidth;
+		windowWidth = newWindowWidth;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH, oldWindowWidth, windowWidth));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW:
+				return getViewportRow();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN:
+				return getViewportColumn();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT:
+				return getViewportHeight();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH:
+				return getViewportWidth();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT:
+				return getWindowHeight();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH:
+				return getWindowWidth();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW:
+				setViewportRow((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN:
+				setViewportColumn((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT:
+				setViewportHeight((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH:
+				setViewportWidth((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT:
+				setWindowHeight((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH:
+				setWindowWidth((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW:
+				setViewportRow(VIEWPORT_ROW_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN:
+				setViewportColumn(VIEWPORT_COLUMN_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT:
+				setViewportHeight(VIEWPORT_HEIGHT_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH:
+				setViewportWidth(VIEWPORT_WIDTH_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT:
+				setWindowHeight(WINDOW_HEIGHT_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH:
+				setWindowWidth(WINDOW_WIDTH_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW:
+				return viewportRow != VIEWPORT_ROW_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN:
+				return viewportColumn != VIEWPORT_COLUMN_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT:
+				return viewportHeight != VIEWPORT_HEIGHT_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH:
+				return viewportWidth != VIEWPORT_WIDTH_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT:
+				return windowHeight != WINDOW_HEIGHT_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH:
+				return windowWidth != WINDOW_WIDTH_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (viewportRow: ");
+		result.append(viewportRow);
+		result.append(", viewportColumn: ");
+		result.append(viewportColumn);
+		result.append(", viewportHeight: ");
+		result.append(viewportHeight);
+		result.append(", viewportWidth: ");
+		result.append(viewportWidth);
+		result.append(", windowHeight: ");
+		result.append(windowHeight);
+		result.append(", windowWidth: ");
+		result.append(windowWidth);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralCreateWindowImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralCursorTypeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralCursorTypeImpl.java
new file mode 100644
index 0000000..37c5157
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralCursorTypeImpl.java
@@ -0,0 +1,236 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Cursor Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCursorTypeImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralCursorTypeImpl#getCursorType <em>Cursor Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralCursorTypeImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralCursorType {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getCursorType() <em>Cursor Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCursorType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineLineDisplayCursorType CURSOR_TYPE_EDEFAULT = StatemachineLineDisplayCursorType.DISP_CT_NONE;
+
+	/**
+	 * The cached value of the '{@link #getCursorType() <em>Cursor Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCursorType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineLineDisplayCursorType cursorType = CURSOR_TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralCursorTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayCursorType getCursorType() {
+		return cursorType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCursorType(StatemachineLineDisplayCursorType newCursorType) {
+		StatemachineLineDisplayCursorType oldCursorType = cursorType;
+		cursorType = newCursorType == null ? CURSOR_TYPE_EDEFAULT : newCursorType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE, oldCursorType, cursorType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE:
+				return getCursorType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE:
+				setCursorType((StatemachineLineDisplayCursorType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE:
+				setCursorType(CURSOR_TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE:
+				return cursorType != CURSOR_TYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (cursorType: ");
+		result.append(cursorType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralCursorTypeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDestroyWindowImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDestroyWindowImpl.java
new file mode 100644
index 0000000..31d8188
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDestroyWindowImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Destroy Window</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDestroyWindowImpl#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralDestroyWindowImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralDestroyWindow {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralDestroyWindowImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE:
+				return device != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralDestroyWindowImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDeviceBrightnessImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDeviceBrightnessImpl.java
new file mode 100644
index 0000000..cdcc008
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDeviceBrightnessImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Device Brightness</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDeviceBrightnessImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDeviceBrightnessImpl#getBrightness <em>Brightness</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralDeviceBrightnessImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralDeviceBrightness {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getBrightness() <em>Brightness</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBrightness()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int BRIGHTNESS_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getBrightness() <em>Brightness</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBrightness()
+	 * @generated
+	 * @ordered
+	 */
+	protected int brightness = BRIGHTNESS_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralDeviceBrightnessImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getBrightness() {
+		return brightness;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBrightness(int newBrightness) {
+		int oldBrightness = brightness;
+		brightness = newBrightness;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS, oldBrightness, brightness));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS:
+				return getBrightness();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS:
+				setBrightness((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS:
+				setBrightness(BRIGHTNESS_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS:
+				return brightness != BRIGHTNESS_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (brightness: ");
+		result.append(brightness);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralDeviceBrightnessImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayBitmapImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayBitmapImpl.java
new file mode 100644
index 0000000..0396810
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayBitmapImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Display Bitmap</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayBitmapImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayBitmapImpl#getBitmapId <em>Bitmap Id</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralDisplayBitmapImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralDisplayBitmap {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getBitmapId() <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBitmapId()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int BITMAP_ID_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getBitmapId() <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBitmapId()
+	 * @generated
+	 * @ordered
+	 */
+	protected int bitmapId = BITMAP_ID_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralDisplayBitmapImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getBitmapId() {
+		return bitmapId;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBitmapId(int newBitmapId) {
+		int oldBitmapId = bitmapId;
+		bitmapId = newBitmapId;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID, oldBitmapId, bitmapId));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID:
+				return getBitmapId();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID:
+				setBitmapId((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID:
+				setBitmapId(BITMAP_ID_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID:
+				return bitmapId != BITMAP_ID_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (bitmapId: ");
+		result.append(bitmapId);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralDisplayBitmapImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayTextAtImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayTextAtImpl.java
new file mode 100644
index 0000000..b1e986d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayTextAtImpl.java
@@ -0,0 +1,478 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Display Text At</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl#getRow <em>Row</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl#getColumn <em>Column</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl#getText <em>Text</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl#isHasType <em>Has Type</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextAtImpl#getTextType <em>Text Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralDisplayTextAtImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralDisplayTextAt {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getRow() <em>Row</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRow()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int ROW_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getRow() <em>Row</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRow()
+	 * @generated
+	 * @ordered
+	 */
+	protected int row = ROW_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getColumn() <em>Column</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getColumn()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int COLUMN_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getColumn() <em>Column</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getColumn()
+	 * @generated
+	 * @ordered
+	 */
+	protected int column = COLUMN_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getText() <em>Text</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation text;
+
+	/**
+	 * The default value of the '{@link #isHasType() <em>Has Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean HAS_TYPE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isHasType() <em>Has Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasType()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean hasType = HAS_TYPE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getTextType() <em>Text Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTextType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineLineDisplayTextType TEXT_TYPE_EDEFAULT = StatemachineLineDisplayTextType.DISP_DT_NORMAL;
+
+	/**
+	 * The cached value of the '{@link #getTextType() <em>Text Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTextType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineLineDisplayTextType textType = TEXT_TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralDisplayTextAtImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getRow() {
+		return row;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRow(int newRow) {
+		int oldRow = row;
+		row = newRow;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__ROW, oldRow, row));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getColumn() {
+		return column;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setColumn(int newColumn) {
+		int oldColumn = column;
+		column = newColumn;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__COLUMN, oldColumn, column));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getText() {
+		return text;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetText(StatemachineActionFieldConcatenation newText, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldText = text;
+		text = newText;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT, oldText, newText);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setText(StatemachineActionFieldConcatenation newText) {
+		if (newText != text) {
+			NotificationChain msgs = null;
+			if (text != null)
+				msgs = ((InternalEObject)text).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT, null, msgs);
+			if (newText != null)
+				msgs = ((InternalEObject)newText).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT, null, msgs);
+			msgs = basicSetText(newText, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT, newText, newText));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isHasType() {
+		return hasType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHasType(boolean newHasType) {
+		boolean oldHasType = hasType;
+		hasType = newHasType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__HAS_TYPE, oldHasType, hasType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayTextType getTextType() {
+		return textType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTextType(StatemachineLineDisplayTextType newTextType) {
+		StatemachineLineDisplayTextType oldTextType = textType;
+		textType = newTextType == null ? TEXT_TYPE_EDEFAULT : newTextType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT_TYPE, oldTextType, textType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT:
+				return basicSetText(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__ROW:
+				return getRow();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__COLUMN:
+				return getColumn();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT:
+				return getText();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__HAS_TYPE:
+				return isHasType();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT_TYPE:
+				return getTextType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__ROW:
+				setRow((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__COLUMN:
+				setColumn((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT:
+				setText((StatemachineActionFieldConcatenation)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__HAS_TYPE:
+				setHasType((Boolean)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT_TYPE:
+				setTextType((StatemachineLineDisplayTextType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__ROW:
+				setRow(ROW_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__COLUMN:
+				setColumn(COLUMN_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT:
+				setText((StatemachineActionFieldConcatenation)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__HAS_TYPE:
+				setHasType(HAS_TYPE_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT_TYPE:
+				setTextType(TEXT_TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__ROW:
+				return row != ROW_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__COLUMN:
+				return column != COLUMN_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT:
+				return text != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__HAS_TYPE:
+				return hasType != HAS_TYPE_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT_TYPE:
+				return textType != TEXT_TYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (row: ");
+		result.append(row);
+		result.append(", column: ");
+		result.append(column);
+		result.append(", hasType: ");
+		result.append(hasType);
+		result.append(", textType: ");
+		result.append(textType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralDisplayTextAtImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayTextImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayTextImpl.java
new file mode 100644
index 0000000..2e8621f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralDisplayTextImpl.java
@@ -0,0 +1,370 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Display Text</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextImpl#getText <em>Text</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextImpl#isHasType <em>Has Type</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralDisplayTextImpl#getTextType <em>Text Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralDisplayTextImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralDisplayText {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The cached value of the '{@link #getText() <em>Text</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation text;
+
+	/**
+	 * The default value of the '{@link #isHasType() <em>Has Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean HAS_TYPE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isHasType() <em>Has Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasType()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean hasType = HAS_TYPE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getTextType() <em>Text Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTextType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineLineDisplayTextType TEXT_TYPE_EDEFAULT = StatemachineLineDisplayTextType.DISP_DT_NORMAL;
+
+	/**
+	 * The cached value of the '{@link #getTextType() <em>Text Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTextType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineLineDisplayTextType textType = TEXT_TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralDisplayTextImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getText() {
+		return text;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetText(StatemachineActionFieldConcatenation newText, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldText = text;
+		text = newText;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT, oldText, newText);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setText(StatemachineActionFieldConcatenation newText) {
+		if (newText != text) {
+			NotificationChain msgs = null;
+			if (text != null)
+				msgs = ((InternalEObject)text).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT, null, msgs);
+			if (newText != null)
+				msgs = ((InternalEObject)newText).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT, null, msgs);
+			msgs = basicSetText(newText, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT, newText, newText));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isHasType() {
+		return hasType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHasType(boolean newHasType) {
+		boolean oldHasType = hasType;
+		hasType = newHasType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__HAS_TYPE, oldHasType, hasType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayTextType getTextType() {
+		return textType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTextType(StatemachineLineDisplayTextType newTextType) {
+		StatemachineLineDisplayTextType oldTextType = textType;
+		textType = newTextType == null ? TEXT_TYPE_EDEFAULT : newTextType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT_TYPE, oldTextType, textType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT:
+				return basicSetText(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT:
+				return getText();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__HAS_TYPE:
+				return isHasType();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT_TYPE:
+				return getTextType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT:
+				setText((StatemachineActionFieldConcatenation)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__HAS_TYPE:
+				setHasType((Boolean)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT_TYPE:
+				setTextType((StatemachineLineDisplayTextType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT:
+				setText((StatemachineActionFieldConcatenation)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__HAS_TYPE:
+				setHasType(HAS_TYPE_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT_TYPE:
+				setTextType(TEXT_TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT:
+				return text != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__HAS_TYPE:
+				return hasType != HAS_TYPE_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT_TYPE:
+				return textType != TEXT_TYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (hasType: ");
+		result.append(hasType);
+		result.append(", textType: ");
+		result.append(textType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralDisplayTextImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralInterCharacterWaitImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralInterCharacterWaitImpl.java
new file mode 100644
index 0000000..8562aca
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralInterCharacterWaitImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Inter Character Wait</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralInterCharacterWaitImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralInterCharacterWaitImpl#getWait <em>Wait</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralInterCharacterWaitImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralInterCharacterWait {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getWait() <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWait()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int WAIT_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getWait() <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWait()
+	 * @generated
+	 * @ordered
+	 */
+	protected int wait = WAIT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralInterCharacterWaitImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getWait() {
+		return wait;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setWait(int newWait) {
+		int oldWait = wait;
+		wait = newWait;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT, oldWait, wait));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT:
+				return getWait();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT:
+				setWait((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT:
+				setWait(WAIT_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT:
+				return wait != WAIT_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (wait: ");
+		result.append(wait);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralInterCharacterWaitImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeFormatImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeFormatImpl.java
new file mode 100644
index 0000000..10bcbe0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeFormatImpl.java
@@ -0,0 +1,236 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Marquee Format</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeFormatImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeFormatImpl#getFormat <em>Format</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralMarqueeFormatImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralMarqueeFormat {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getFormat() <em>Format</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFormat()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineLineDisplayMarqueeFormat FORMAT_EDEFAULT = StatemachineLineDisplayMarqueeFormat.DISP_MF_WALK;
+
+	/**
+	 * The cached value of the '{@link #getFormat() <em>Format</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFormat()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineLineDisplayMarqueeFormat format = FORMAT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralMarqueeFormatImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayMarqueeFormat getFormat() {
+		return format;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFormat(StatemachineLineDisplayMarqueeFormat newFormat) {
+		StatemachineLineDisplayMarqueeFormat oldFormat = format;
+		format = newFormat == null ? FORMAT_EDEFAULT : newFormat;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT, oldFormat, format));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT:
+				return getFormat();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT:
+				setFormat((StatemachineLineDisplayMarqueeFormat)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT:
+				setFormat(FORMAT_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT:
+				return format != FORMAT_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (format: ");
+		result.append(format);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralMarqueeFormatImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeRepeatWaitImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeRepeatWaitImpl.java
new file mode 100644
index 0000000..81449dc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeRepeatWaitImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Marquee Repeat Wait</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeRepeatWaitImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeRepeatWaitImpl#getWait <em>Wait</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralMarqueeRepeatWaitImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralMarqueeRepeatWait {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getWait() <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWait()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int WAIT_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getWait() <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWait()
+	 * @generated
+	 * @ordered
+	 */
+	protected int wait = WAIT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralMarqueeRepeatWaitImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getWait() {
+		return wait;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setWait(int newWait) {
+		int oldWait = wait;
+		wait = newWait;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT, oldWait, wait));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT:
+				return getWait();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT:
+				setWait((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT:
+				setWait(WAIT_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT:
+				return wait != WAIT_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (wait: ");
+		result.append(wait);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralMarqueeRepeatWaitImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeTypeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeTypeImpl.java
new file mode 100644
index 0000000..10b394b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeTypeImpl.java
@@ -0,0 +1,236 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Marquee Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeTypeImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeTypeImpl#getMarqueeType <em>Marquee Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralMarqueeTypeImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralMarqueeType {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getMarqueeType() <em>Marquee Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMarqueeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineLineDisplayMarqueeType MARQUEE_TYPE_EDEFAULT = StatemachineLineDisplayMarqueeType.DISP_MT_NONE;
+
+	/**
+	 * The cached value of the '{@link #getMarqueeType() <em>Marquee Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMarqueeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineLineDisplayMarqueeType marqueeType = MARQUEE_TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralMarqueeTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayMarqueeType getMarqueeType() {
+		return marqueeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMarqueeType(StatemachineLineDisplayMarqueeType newMarqueeType) {
+		StatemachineLineDisplayMarqueeType oldMarqueeType = marqueeType;
+		marqueeType = newMarqueeType == null ? MARQUEE_TYPE_EDEFAULT : newMarqueeType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE, oldMarqueeType, marqueeType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE:
+				return getMarqueeType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE:
+				setMarqueeType((StatemachineLineDisplayMarqueeType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE:
+				setMarqueeType(MARQUEE_TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE:
+				return marqueeType != MARQUEE_TYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (marqueeType: ");
+		result.append(marqueeType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralMarqueeTypeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeUnitWaitImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeUnitWaitImpl.java
new file mode 100644
index 0000000..bc7fcc4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralMarqueeUnitWaitImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Marquee Unit Wait</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeUnitWaitImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralMarqueeUnitWaitImpl#getWait <em>Wait</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralMarqueeUnitWaitImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralMarqueeUnitWait {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getWait() <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWait()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int WAIT_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getWait() <em>Wait</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWait()
+	 * @generated
+	 * @ordered
+	 */
+	protected int wait = WAIT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralMarqueeUnitWaitImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getWait() {
+		return wait;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setWait(int newWait) {
+		int oldWait = wait;
+		wait = newWait;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT, oldWait, wait));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT:
+				return getWait();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT:
+				setWait((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT:
+				setWait(WAIT_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT:
+				return wait != WAIT_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (wait: ");
+		result.append(wait);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralMarqueeUnitWaitImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralOpenDrawerImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralOpenDrawerImpl.java
new file mode 100644
index 0000000..66271a0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralOpenDrawerImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Open Drawer</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralOpenDrawerImpl#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralOpenDrawerImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralOpenDrawer {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceCashDrawer device;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralOpenDrawerImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceCashDrawer getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceCashDrawer)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceCashDrawer basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceCashDrawer newDevice) {
+		StatemachinePeripheralDeviceCashDrawer oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE:
+				setDevice((StatemachinePeripheralDeviceCashDrawer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE:
+				setDevice((StatemachinePeripheralDeviceCashDrawer)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE:
+				return device != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralOpenDrawerImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTAcknowledgeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTAcknowledgeImpl.java
new file mode 100644
index 0000000..cf09fac
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTAcknowledgeImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral PT Acknowledge</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAcknowledgeImpl#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPTAcknowledgeImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPTAcknowledge {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePT device;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPTAcknowledgeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePT)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePT newDevice) {
+		StatemachinePeripheralDevicePT oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE:
+				return device != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralPTAcknowledgeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTAuthorizationImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTAuthorizationImpl.java
new file mode 100644
index 0000000..f86d3eb
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTAuthorizationImpl.java
@@ -0,0 +1,247 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral PT Authorization</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAuthorizationImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTAuthorizationImpl#getAmount <em>Amount</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPTAuthorizationImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPTAuthorization {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePT device;
+
+	/**
+	 * The cached value of the '{@link #getAmount() <em>Amount</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAmount()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation amount;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPTAuthorizationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePT)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePT newDevice) {
+		StatemachinePeripheralDevicePT oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getAmount() {
+		return amount;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetAmount(StatemachineActionFieldConcatenation newAmount, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldAmount = amount;
+		amount = newAmount;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT, oldAmount, newAmount);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAmount(StatemachineActionFieldConcatenation newAmount) {
+		if (newAmount != amount) {
+			NotificationChain msgs = null;
+			if (amount != null)
+				msgs = ((InternalEObject)amount).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT, null, msgs);
+			if (newAmount != null)
+				msgs = ((InternalEObject)newAmount).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT, null, msgs);
+			msgs = basicSetAmount(newAmount, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT, newAmount, newAmount));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT:
+				return basicSetAmount(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT:
+				return getAmount();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT:
+				setAmount((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT:
+				setAmount((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT:
+				return amount != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralPTAuthorizationImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTCloseImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTCloseImpl.java
new file mode 100644
index 0000000..2296081
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTCloseImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral PT Close</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTCloseImpl#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPTCloseImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPTClose {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePT device;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPTCloseImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePT)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePT newDevice) {
+		StatemachinePeripheralDevicePT oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE:
+				return device != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralPTCloseImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTOpenImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTOpenImpl.java
new file mode 100644
index 0000000..52eaaee
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTOpenImpl.java
@@ -0,0 +1,313 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral PT Open</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTOpenImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTOpenImpl#getHost <em>Host</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTOpenImpl#getPort <em>Port</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPTOpenImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPTOpen {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePT device;
+
+	/**
+	 * The cached value of the '{@link #getHost() <em>Host</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getHost()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation host;
+
+	/**
+	 * The cached value of the '{@link #getPort() <em>Port</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPort()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation port;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPTOpenImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePT)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePT newDevice) {
+		StatemachinePeripheralDevicePT oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getHost() {
+		return host;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetHost(StatemachineActionFieldConcatenation newHost, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldHost = host;
+		host = newHost;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST, oldHost, newHost);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHost(StatemachineActionFieldConcatenation newHost) {
+		if (newHost != host) {
+			NotificationChain msgs = null;
+			if (host != null)
+				msgs = ((InternalEObject)host).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST, null, msgs);
+			if (newHost != null)
+				msgs = ((InternalEObject)newHost).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST, null, msgs);
+			msgs = basicSetHost(newHost, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST, newHost, newHost));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getPort() {
+		return port;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetPort(StatemachineActionFieldConcatenation newPort, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldPort = port;
+		port = newPort;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT, oldPort, newPort);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPort(StatemachineActionFieldConcatenation newPort) {
+		if (newPort != port) {
+			NotificationChain msgs = null;
+			if (port != null)
+				msgs = ((InternalEObject)port).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT, null, msgs);
+			if (newPort != null)
+				msgs = ((InternalEObject)newPort).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT, null, msgs);
+			msgs = basicSetPort(newPort, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT, newPort, newPort));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST:
+				return basicSetHost(null, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT:
+				return basicSetPort(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST:
+				return getHost();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT:
+				return getPort();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST:
+				setHost((StatemachineActionFieldConcatenation)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT:
+				setPort((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST:
+				setHost((StatemachineActionFieldConcatenation)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT:
+				setPort((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST:
+				return host != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT:
+				return port != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralPTOpenImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTRegistrationImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTRegistrationImpl.java
new file mode 100644
index 0000000..c1e601e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTRegistrationImpl.java
@@ -0,0 +1,315 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral PT Registration</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTRegistrationImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTRegistrationImpl#getPassword <em>Password</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTRegistrationImpl#getConfiguration <em>Configuration</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPTRegistrationImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPTRegistration {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePT device;
+
+	/**
+	 * The cached value of the '{@link #getPassword() <em>Password</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPassword()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation password;
+
+	/**
+	 * The default value of the '{@link #getConfiguration() <em>Configuration</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getConfiguration()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String CONFIGURATION_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getConfiguration() <em>Configuration</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getConfiguration()
+	 * @generated
+	 * @ordered
+	 */
+	protected String configuration = CONFIGURATION_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPTRegistrationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePT)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePT newDevice) {
+		StatemachinePeripheralDevicePT oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getPassword() {
+		return password;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetPassword(StatemachineActionFieldConcatenation newPassword, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldPassword = password;
+		password = newPassword;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD, oldPassword, newPassword);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPassword(StatemachineActionFieldConcatenation newPassword) {
+		if (newPassword != password) {
+			NotificationChain msgs = null;
+			if (password != null)
+				msgs = ((InternalEObject)password).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD, null, msgs);
+			if (newPassword != null)
+				msgs = ((InternalEObject)newPassword).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD, null, msgs);
+			msgs = basicSetPassword(newPassword, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD, newPassword, newPassword));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getConfiguration() {
+		return configuration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setConfiguration(String newConfiguration) {
+		String oldConfiguration = configuration;
+		configuration = newConfiguration;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION, oldConfiguration, configuration));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD:
+				return basicSetPassword(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD:
+				return getPassword();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION:
+				return getConfiguration();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD:
+				setPassword((StatemachineActionFieldConcatenation)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION:
+				setConfiguration((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD:
+				setPassword((StatemachineActionFieldConcatenation)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION:
+				setConfiguration(CONFIGURATION_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD:
+				return password != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION:
+				return CONFIGURATION_EDEFAULT == null ? configuration != null : !CONFIGURATION_EDEFAULT.equals(configuration);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (configuration: ");
+		result.append(configuration);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralPTRegistrationImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTResponseImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTResponseImpl.java
new file mode 100644
index 0000000..f194bef
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTResponseImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral PT Response</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTResponseImpl#getDevice <em>Device</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPTResponseImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPTResponse {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePT device;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPTResponseImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePT)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePT newDevice) {
+		StatemachinePeripheralDevicePT oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE:
+				return device != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralPTResponseImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTReversalImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTReversalImpl.java
new file mode 100644
index 0000000..3e6109d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPTReversalImpl.java
@@ -0,0 +1,313 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral PT Reversal</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTReversalImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTReversalImpl#getPassword <em>Password</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPTReversalImpl#getReceipt <em>Receipt</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPTReversalImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPTReversal {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePT device;
+
+	/**
+	 * The cached value of the '{@link #getPassword() <em>Password</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPassword()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation password;
+
+	/**
+	 * The cached value of the '{@link #getReceipt() <em>Receipt</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getReceipt()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation receipt;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPTReversalImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePT)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePT newDevice) {
+		StatemachinePeripheralDevicePT oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getPassword() {
+		return password;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetPassword(StatemachineActionFieldConcatenation newPassword, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldPassword = password;
+		password = newPassword;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD, oldPassword, newPassword);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPassword(StatemachineActionFieldConcatenation newPassword) {
+		if (newPassword != password) {
+			NotificationChain msgs = null;
+			if (password != null)
+				msgs = ((InternalEObject)password).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD, null, msgs);
+			if (newPassword != null)
+				msgs = ((InternalEObject)newPassword).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD, null, msgs);
+			msgs = basicSetPassword(newPassword, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD, newPassword, newPassword));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getReceipt() {
+		return receipt;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetReceipt(StatemachineActionFieldConcatenation newReceipt, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldReceipt = receipt;
+		receipt = newReceipt;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT, oldReceipt, newReceipt);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setReceipt(StatemachineActionFieldConcatenation newReceipt) {
+		if (newReceipt != receipt) {
+			NotificationChain msgs = null;
+			if (receipt != null)
+				msgs = ((InternalEObject)receipt).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT, null, msgs);
+			if (newReceipt != null)
+				msgs = ((InternalEObject)newReceipt).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT, null, msgs);
+			msgs = basicSetReceipt(newReceipt, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT, newReceipt, newReceipt));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD:
+				return basicSetPassword(null, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT:
+				return basicSetReceipt(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD:
+				return getPassword();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT:
+				return getReceipt();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD:
+				setPassword((StatemachineActionFieldConcatenation)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT:
+				setReceipt((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE:
+				setDevice((StatemachinePeripheralDevicePT)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD:
+				setPassword((StatemachineActionFieldConcatenation)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT:
+				setReceipt((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD:
+				return password != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT:
+				return receipt != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralPTReversalImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintBarcodeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintBarcodeImpl.java
new file mode 100644
index 0000000..9185c7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintBarcodeImpl.java
@@ -0,0 +1,290 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Print Barcode</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBarcodeImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBarcodeImpl#getData <em>Data</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBarcodeImpl#getBarcodeType <em>Barcode Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPrintBarcodeImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPrintBarcode {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePOSPrinter device;
+
+	/**
+	 * The default value of the '{@link #getData() <em>Data</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getData()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String DATA_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getData() <em>Data</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getData()
+	 * @generated
+	 * @ordered
+	 */
+	protected String data = DATA_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getBarcodeType() <em>Barcode Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBarcodeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachinePOSPrinterBarcodeType BARCODE_TYPE_EDEFAULT = StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCA;
+
+	/**
+	 * The cached value of the '{@link #getBarcodeType() <em>Barcode Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBarcodeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePOSPrinterBarcodeType barcodeType = BARCODE_TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPrintBarcodeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePOSPrinter)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePOSPrinter newDevice) {
+		StatemachinePeripheralDevicePOSPrinter oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getData() {
+		return data;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setData(String newData) {
+		String oldData = data;
+		data = newData;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA, oldData, data));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePOSPrinterBarcodeType getBarcodeType() {
+		return barcodeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBarcodeType(StatemachinePOSPrinterBarcodeType newBarcodeType) {
+		StatemachinePOSPrinterBarcodeType oldBarcodeType = barcodeType;
+		barcodeType = newBarcodeType == null ? BARCODE_TYPE_EDEFAULT : newBarcodeType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE, oldBarcodeType, barcodeType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA:
+				return getData();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE:
+				return getBarcodeType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA:
+				setData((String)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE:
+				setBarcodeType((StatemachinePOSPrinterBarcodeType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA:
+				setData(DATA_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE:
+				setBarcodeType(BARCODE_TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA:
+				return DATA_EDEFAULT == null ? data != null : !DATA_EDEFAULT.equals(data);
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE:
+				return barcodeType != BARCODE_TYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (data: ");
+		result.append(data);
+		result.append(", barcodeType: ");
+		result.append(barcodeType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralPrintBarcodeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintBitmapImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintBitmapImpl.java
new file mode 100644
index 0000000..7814a0a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintBitmapImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Print Bitmap</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBitmapImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintBitmapImpl#getBitmapId <em>Bitmap Id</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPrintBitmapImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPrintBitmap {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePOSPrinter device;
+
+	/**
+	 * The default value of the '{@link #getBitmapId() <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBitmapId()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int BITMAP_ID_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getBitmapId() <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBitmapId()
+	 * @generated
+	 * @ordered
+	 */
+	protected int bitmapId = BITMAP_ID_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPrintBitmapImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePOSPrinter)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePOSPrinter newDevice) {
+		StatemachinePeripheralDevicePOSPrinter oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getBitmapId() {
+		return bitmapId;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBitmapId(int newBitmapId) {
+		int oldBitmapId = bitmapId;
+		bitmapId = newBitmapId;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID, oldBitmapId, bitmapId));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID:
+				return getBitmapId();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID:
+				setBitmapId((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID:
+				setBitmapId(BITMAP_ID_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID:
+				return bitmapId != BITMAP_ID_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (bitmapId: ");
+		result.append(bitmapId);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralPrintBitmapImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintCutImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintCutImpl.java
new file mode 100644
index 0000000..5e48da9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintCutImpl.java
@@ -0,0 +1,247 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Print Cut</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintCutImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintCutImpl#getText <em>Text</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPrintCutImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPrintCut {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePOSPrinter device;
+
+	/**
+	 * The cached value of the '{@link #getText() <em>Text</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation text;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPrintCutImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePOSPrinter)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePOSPrinter newDevice) {
+		StatemachinePeripheralDevicePOSPrinter oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getText() {
+		return text;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetText(StatemachineActionFieldConcatenation newText, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldText = text;
+		text = newText;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT, oldText, newText);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setText(StatemachineActionFieldConcatenation newText) {
+		if (newText != text) {
+			NotificationChain msgs = null;
+			if (text != null)
+				msgs = ((InternalEObject)text).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT, null, msgs);
+			if (newText != null)
+				msgs = ((InternalEObject)newText).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT, null, msgs);
+			msgs = basicSetText(newText, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT, newText, newText));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT:
+				return basicSetText(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT:
+				return getText();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT:
+				setText((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT:
+				setText((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT:
+				return text != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionPeripheralPrintCutImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintNormalImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintNormalImpl.java
new file mode 100644
index 0000000..1add76c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintNormalImpl.java
@@ -0,0 +1,316 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Print Normal</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintNormalImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintNormalImpl#getText <em>Text</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintNormalImpl#getBarcodeType <em>Barcode Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPrintNormalImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPrintNormal {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePOSPrinter device;
+
+	/**
+	 * The cached value of the '{@link #getText() <em>Text</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation text;
+
+	/**
+	 * The default value of the '{@link #getBarcodeType() <em>Barcode Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBarcodeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachinePOSPrinterBarcodeType BARCODE_TYPE_EDEFAULT = StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCA;
+
+	/**
+	 * The cached value of the '{@link #getBarcodeType() <em>Barcode Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBarcodeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePOSPrinterBarcodeType barcodeType = BARCODE_TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPrintNormalImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePOSPrinter)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePOSPrinter newDevice) {
+		StatemachinePeripheralDevicePOSPrinter oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getText() {
+		return text;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetText(StatemachineActionFieldConcatenation newText, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldText = text;
+		text = newText;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT, oldText, newText);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setText(StatemachineActionFieldConcatenation newText) {
+		if (newText != text) {
+			NotificationChain msgs = null;
+			if (text != null)
+				msgs = ((InternalEObject)text).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT, null, msgs);
+			if (newText != null)
+				msgs = ((InternalEObject)newText).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT, null, msgs);
+			msgs = basicSetText(newText, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT, newText, newText));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePOSPrinterBarcodeType getBarcodeType() {
+		return barcodeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBarcodeType(StatemachinePOSPrinterBarcodeType newBarcodeType) {
+		StatemachinePOSPrinterBarcodeType oldBarcodeType = barcodeType;
+		barcodeType = newBarcodeType == null ? BARCODE_TYPE_EDEFAULT : newBarcodeType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__BARCODE_TYPE, oldBarcodeType, barcodeType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT:
+				return basicSetText(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT:
+				return getText();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__BARCODE_TYPE:
+				return getBarcodeType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT:
+				setText((StatemachineActionFieldConcatenation)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__BARCODE_TYPE:
+				setBarcodeType((StatemachinePOSPrinterBarcodeType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT:
+				setText((StatemachineActionFieldConcatenation)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__BARCODE_TYPE:
+				setBarcodeType(BARCODE_TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT:
+				return text != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__BARCODE_TYPE:
+				return barcodeType != BARCODE_TYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (barcodeType: ");
+		result.append(barcodeType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralPrintNormalImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintRegisterBitmapImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintRegisterBitmapImpl.java
new file mode 100644
index 0000000..1f0df65
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintRegisterBitmapImpl.java
@@ -0,0 +1,289 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Print Register Bitmap</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintRegisterBitmapImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintRegisterBitmapImpl#getBitmapId <em>Bitmap Id</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintRegisterBitmapImpl#getName <em>Name</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPrintRegisterBitmapImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPrintRegisterBitmap {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDevicePOSPrinter device;
+
+	/**
+	 * The default value of the '{@link #getBitmapId() <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBitmapId()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int BITMAP_ID_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getBitmapId() <em>Bitmap Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBitmapId()
+	 * @generated
+	 * @ordered
+	 */
+	protected int bitmapId = BITMAP_ID_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPrintRegisterBitmapImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDevicePOSPrinter)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDevicePOSPrinter newDevice) {
+		StatemachinePeripheralDevicePOSPrinter oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getBitmapId() {
+		return bitmapId;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBitmapId(int newBitmapId) {
+		int oldBitmapId = bitmapId;
+		bitmapId = newBitmapId;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID, oldBitmapId, bitmapId));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID:
+				return getBitmapId();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME:
+				return getName();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID:
+				setBitmapId((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME:
+				setName((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE:
+				setDevice((StatemachinePeripheralDevicePOSPrinter)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID:
+				setBitmapId(BITMAP_ID_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID:
+				return bitmapId != BITMAP_ID_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (bitmapId: ");
+		result.append(bitmapId);
+		result.append(", name: ");
+		result.append(name);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralPrintRegisterBitmapImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintReportImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintReportImpl.java
new file mode 100644
index 0000000..de3f8a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralPrintReportImpl.java
@@ -0,0 +1,297 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.reportdsl.Report;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Print Report</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintReportImpl#getReport <em>Report</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintReportImpl#getKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralPrintReportImpl#isHasFilter <em>Has Filter</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralPrintReportImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralPrintReport {
+	/**
+	 * The cached value of the '{@link #getReport() <em>Report</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getReport()
+	 * @generated
+	 * @ordered
+	 */
+	protected Report report;
+
+	/**
+	 * The cached value of the '{@link #getKey() <em>Key</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKey()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineStorage key;
+
+	/**
+	 * The default value of the '{@link #isHasFilter() <em>Has Filter</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasFilter()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean HAS_FILTER_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isHasFilter() <em>Has Filter</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasFilter()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean hasFilter = HAS_FILTER_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralPrintReportImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Report getReport() {
+		if (report != null && report.eIsProxy()) {
+			InternalEObject oldReport = (InternalEObject)report;
+			report = (Report)eResolveProxy(oldReport);
+			if (report != oldReport) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT, oldReport, report));
+			}
+		}
+		return report;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Report basicGetReport() {
+		return report;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setReport(Report newReport) {
+		Report oldReport = report;
+		report = newReport;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT, oldReport, report));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineStorage getKey() {
+		if (key != null && key.eIsProxy()) {
+			InternalEObject oldKey = (InternalEObject)key;
+			key = (StatemachineStorage)eResolveProxy(oldKey);
+			if (key != oldKey) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY, oldKey, key));
+			}
+		}
+		return key;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineStorage basicGetKey() {
+		return key;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKey(StatemachineStorage newKey) {
+		StatemachineStorage oldKey = key;
+		key = newKey;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY, oldKey, key));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isHasFilter() {
+		return hasFilter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHasFilter(boolean newHasFilter) {
+		boolean oldHasFilter = hasFilter;
+		hasFilter = newHasFilter;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__HAS_FILTER, oldHasFilter, hasFilter));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT:
+				if (resolve) return getReport();
+				return basicGetReport();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY:
+				if (resolve) return getKey();
+				return basicGetKey();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__HAS_FILTER:
+				return isHasFilter();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT:
+				setReport((Report)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY:
+				setKey((StatemachineStorage)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__HAS_FILTER:
+				setHasFilter((Boolean)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT:
+				setReport((Report)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY:
+				setKey((StatemachineStorage)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__HAS_FILTER:
+				setHasFilter(HAS_FILTER_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT:
+				return report != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY:
+				return key != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__HAS_FILTER:
+				return hasFilter != HAS_FILTER_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (hasFilter: ");
+		result.append(hasFilter);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralPrintReportImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralScrollImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralScrollImpl.java
new file mode 100644
index 0000000..fa96115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionPeripheralScrollImpl.java
@@ -0,0 +1,290 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Peripheral Scroll</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralScrollImpl#getDevice <em>Device</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralScrollImpl#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionPeripheralScrollImpl#getUnits <em>Units</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionPeripheralScrollImpl extends StatemachineLazyResolverImpl implements StatemachineActionPeripheralScroll {
+	/**
+	 * The cached value of the '{@link #getDevice() <em>Device</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDevice()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachinePeripheralDeviceLineDisplay device;
+
+	/**
+	 * The default value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineLineDisplayScrollTextType DIRECTION_EDEFAULT = StatemachineLineDisplayScrollTextType.DISP_ST_UP;
+
+	/**
+	 * The cached value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineLineDisplayScrollTextType direction = DIRECTION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getUnits() <em>Units</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUnits()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int UNITS_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getUnits() <em>Units</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUnits()
+	 * @generated
+	 * @ordered
+	 */
+	protected int units = UNITS_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionPeripheralScrollImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay getDevice() {
+		if (device != null && device.eIsProxy()) {
+			InternalEObject oldDevice = (InternalEObject)device;
+			device = (StatemachinePeripheralDeviceLineDisplay)eResolveProxy(oldDevice);
+			if (device != oldDevice) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE, oldDevice, device));
+			}
+		}
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay basicGetDevice() {
+		return device;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDevice(StatemachinePeripheralDeviceLineDisplay newDevice) {
+		StatemachinePeripheralDeviceLineDisplay oldDevice = device;
+		device = newDevice;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE, oldDevice, device));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayScrollTextType getDirection() {
+		return direction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDirection(StatemachineLineDisplayScrollTextType newDirection) {
+		StatemachineLineDisplayScrollTextType oldDirection = direction;
+		direction = newDirection == null ? DIRECTION_EDEFAULT : newDirection;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION, oldDirection, direction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getUnits() {
+		return units;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUnits(int newUnits) {
+		int oldUnits = units;
+		units = newUnits;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS, oldUnits, units));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE:
+				if (resolve) return getDevice();
+				return basicGetDevice();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION:
+				return getDirection();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS:
+				return getUnits();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION:
+				setDirection((StatemachineLineDisplayScrollTextType)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS:
+				setUnits((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE:
+				setDevice((StatemachinePeripheralDeviceLineDisplay)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION:
+				setDirection(DIRECTION_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS:
+				setUnits(UNITS_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE:
+				return device != null;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION:
+				return direction != DIRECTION_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS:
+				return units != UNITS_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (direction: ");
+		result.append(direction);
+		result.append(", units: ");
+		result.append(units);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineActionPeripheralScrollImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionSchedulerImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionSchedulerImpl.java
new file mode 100644
index 0000000..09004e1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineActionSchedulerImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Action Scheduler</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineActionSchedulerImpl#getScheduler <em>Scheduler</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineActionSchedulerImpl extends StatemachineLazyResolverImpl implements StatemachineActionScheduler {
+	/**
+	 * The cached value of the '{@link #getScheduler() <em>Scheduler</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getScheduler()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlSchedulerAttribute scheduler;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineActionSchedulerImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_SCHEDULER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlSchedulerAttribute getScheduler() {
+		if (scheduler != null && scheduler.eIsProxy()) {
+			InternalEObject oldScheduler = (InternalEObject)scheduler;
+			scheduler = (StatemachineControlSchedulerAttribute)eResolveProxy(oldScheduler);
+			if (scheduler != oldScheduler) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER, oldScheduler, scheduler));
+			}
+		}
+		return scheduler;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlSchedulerAttribute basicGetScheduler() {
+		return scheduler;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setScheduler(StatemachineControlSchedulerAttribute newScheduler) {
+		StatemachineControlSchedulerAttribute oldScheduler = scheduler;
+		scheduler = newScheduler;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER, oldScheduler, scheduler));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER:
+				if (resolve) return getScheduler();
+				return basicGetScheduler();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER:
+				setScheduler((StatemachineControlSchedulerAttribute)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER:
+				setScheduler((StatemachineControlSchedulerAttribute)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER:
+				return scheduler != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineActionSchedulerImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineBaseImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineBaseImpl.java
new file mode 100644
index 0000000..8dd5170
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineBaseImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineBase;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Base</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineBaseImpl#getName <em>Name</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineBaseImpl extends StatemachineLazyResolverImpl implements StatemachineBase {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineBaseImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_BASE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_BASE__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_BASE__NAME:
+				return getName();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_BASE__NAME:
+				setName((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_BASE__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_BASE__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineBaseImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventEventImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventEventImpl.java
new file mode 100644
index 0000000..61eac8c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventEventImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Button Attribute Event Event</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventEventImpl#getEvent <em>Event</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlButtonAttributeEventEventImpl extends StatemachineLazyResolverImpl implements StatemachineControlButtonAttributeEventEvent {
+	/**
+	 * The cached value of the '{@link #getEvent() <em>Event</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEvent()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineEvent event;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlButtonAttributeEventEventImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent getEvent() {
+		if (event != null && event.eIsProxy()) {
+			InternalEObject oldEvent = (InternalEObject)event;
+			event = (StatemachineEvent)eResolveProxy(oldEvent);
+			if (event != oldEvent) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT, oldEvent, event));
+			}
+		}
+		return event;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent basicGetEvent() {
+		return event;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEvent(StatemachineEvent newEvent) {
+		StatemachineEvent oldEvent = event;
+		event = newEvent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT, oldEvent, event));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT:
+				if (resolve) return getEvent();
+				return basicGetEvent();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT:
+				setEvent((StatemachineEvent)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT:
+				setEvent((StatemachineEvent)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT:
+				return event != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineControlButtonAttributeEventEventImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventIdentityImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventIdentityImpl.java
new file mode 100644
index 0000000..e04630d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventIdentityImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Button Attribute Event Identity</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventIdentityImpl#getIdentity <em>Identity</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlButtonAttributeEventIdentityImpl extends StatemachineLazyResolverImpl implements StatemachineControlButtonAttributeEventIdentity {
+	/**
+	 * The default value of the '{@link #getIdentity() <em>Identity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getIdentity()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int IDENTITY_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getIdentity() <em>Identity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getIdentity()
+	 * @generated
+	 * @ordered
+	 */
+	protected int identity = IDENTITY_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlButtonAttributeEventIdentityImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getIdentity() {
+		return identity;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setIdentity(int newIdentity) {
+		int oldIdentity = identity;
+		identity = newIdentity;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY, oldIdentity, identity));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY:
+				return getIdentity();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY:
+				setIdentity((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY:
+				setIdentity(IDENTITY_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY:
+				return identity != IDENTITY_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (identity: ");
+		result.append(identity);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineControlButtonAttributeEventIdentityImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventKeyboardImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventKeyboardImpl.java
new file mode 100644
index 0000000..d197cf4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeEventKeyboardImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Button Attribute Event Keyboard</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeEventKeyboardImpl#getKeystroke <em>Keystroke</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlButtonAttributeEventKeyboardImpl extends StatemachineLazyResolverImpl implements StatemachineControlButtonAttributeEventKeyboard {
+	/**
+	 * The default value of the '{@link #getKeystroke() <em>Keystroke</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKeystroke()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String KEYSTROKE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getKeystroke() <em>Keystroke</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKeystroke()
+	 * @generated
+	 * @ordered
+	 */
+	protected String keystroke = KEYSTROKE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlButtonAttributeEventKeyboardImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getKeystroke() {
+		return keystroke;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKeystroke(String newKeystroke) {
+		String oldKeystroke = keystroke;
+		keystroke = newKeystroke;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE, oldKeystroke, keystroke));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE:
+				return getKeystroke();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE:
+				setKeystroke((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE:
+				setKeystroke(KEYSTROKE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE:
+				return KEYSTROKE_EDEFAULT == null ? keystroke != null : !KEYSTROKE_EDEFAULT.equals(keystroke);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (keystroke: ");
+		result.append(keystroke);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineControlButtonAttributeEventKeyboardImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeImpl.java
new file mode 100644
index 0000000..e536662
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonAttributeImpl.java
@@ -0,0 +1,308 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Button Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeImpl#isHasImage <em>Has Image</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeImpl#getImage <em>Image</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonAttributeImpl#getEvent <em>Event</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlButtonAttributeImpl extends StatemachineBaseImpl implements StatemachineControlButtonAttribute {
+	/**
+	 * The default value of the '{@link #isHasImage() <em>Has Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasImage()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean HAS_IMAGE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isHasImage() <em>Has Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasImage()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean hasImage = HAS_IMAGE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getImage() <em>Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getImage()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String IMAGE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getImage() <em>Image</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getImage()
+	 * @generated
+	 * @ordered
+	 */
+	protected String image = IMAGE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getEvent() <em>Event</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEvent()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlButtonAttributeEvent event;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlButtonAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isHasImage() {
+		return hasImage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHasImage(boolean newHasImage) {
+		boolean oldHasImage = hasImage;
+		hasImage = newHasImage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__HAS_IMAGE, oldHasImage, hasImage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getImage() {
+		return image;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setImage(String newImage) {
+		String oldImage = image;
+		image = newImage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__IMAGE, oldImage, image));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttributeEvent getEvent() {
+		return event;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetEvent(StatemachineControlButtonAttributeEvent newEvent, NotificationChain msgs) {
+		StatemachineControlButtonAttributeEvent oldEvent = event;
+		event = newEvent;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT, oldEvent, newEvent);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEvent(StatemachineControlButtonAttributeEvent newEvent) {
+		if (newEvent != event) {
+			NotificationChain msgs = null;
+			if (event != null)
+				msgs = ((InternalEObject)event).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT, null, msgs);
+			if (newEvent != null)
+				msgs = ((InternalEObject)newEvent).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT, null, msgs);
+			msgs = basicSetEvent(newEvent, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT, newEvent, newEvent));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT:
+				return basicSetEvent(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__HAS_IMAGE:
+				return isHasImage();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__IMAGE:
+				return getImage();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT:
+				return getEvent();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__HAS_IMAGE:
+				setHasImage((Boolean)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__IMAGE:
+				setImage((String)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT:
+				setEvent((StatemachineControlButtonAttributeEvent)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__HAS_IMAGE:
+				setHasImage(HAS_IMAGE_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__IMAGE:
+				setImage(IMAGE_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT:
+				setEvent((StatemachineControlButtonAttributeEvent)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__HAS_IMAGE:
+				return hasImage != HAS_IMAGE_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__IMAGE:
+				return IMAGE_EDEFAULT == null ? image != null : !IMAGE_EDEFAULT.equals(image);
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT:
+				return event != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (hasImage: ");
+		result.append(hasImage);
+		result.append(", image: ");
+		result.append(image);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineControlButtonAttributeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonImpl.java
new file mode 100644
index 0000000..020166c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlButtonImpl.java
@@ -0,0 +1,233 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButton;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Button</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonImpl#getEventType <em>Event Type</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlButtonImpl#getButtons <em>Buttons</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlButtonImpl extends StatemachineBaseImpl implements StatemachineControlButton {
+	/**
+	 * The default value of the '{@link #getEventType() <em>Event Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEventType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineControlButtonEventType EVENT_TYPE_EDEFAULT = StatemachineControlButtonEventType.KEYBOARD;
+
+	/**
+	 * The cached value of the '{@link #getEventType() <em>Event Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEventType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlButtonEventType eventType = EVENT_TYPE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getButtons() <em>Buttons</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getButtons()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineControlButtonAttribute> buttons;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlButtonImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonEventType getEventType() {
+		return eventType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEventType(StatemachineControlButtonEventType newEventType) {
+		StatemachineControlButtonEventType oldEventType = eventType;
+		eventType = newEventType == null ? EVENT_TYPE_EDEFAULT : newEventType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__EVENT_TYPE, oldEventType, eventType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineControlButtonAttribute> getButtons() {
+		if (buttons == null) {
+			buttons = new EObjectContainmentEList<StatemachineControlButtonAttribute>(StatemachineControlButtonAttribute.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__BUTTONS);
+		}
+		return buttons;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__BUTTONS:
+				return ((InternalEList<?>)getButtons()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__EVENT_TYPE:
+				return getEventType();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__BUTTONS:
+				return getButtons();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__EVENT_TYPE:
+				setEventType((StatemachineControlButtonEventType)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__BUTTONS:
+				getButtons().clear();
+				getButtons().addAll((Collection<? extends StatemachineControlButtonAttribute>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__EVENT_TYPE:
+				setEventType(EVENT_TYPE_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__BUTTONS:
+				getButtons().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__EVENT_TYPE:
+				return eventType != EVENT_TYPE_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON__BUTTONS:
+				return buttons != null && !buttons.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (eventType: ");
+		result.append(eventType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineControlButtonImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlDTOAttributeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlDTOAttributeImpl.java
new file mode 100644
index 0000000..2d346ea
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlDTOAttributeImpl.java
@@ -0,0 +1,315 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDTOType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control DTO Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOAttributeImpl#getAttributeType <em>Attribute Type</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOAttributeImpl#isHasEvent <em>Has Event</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOAttributeImpl#getEvent <em>Event</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlDTOAttributeImpl extends StatemachineBaseImpl implements StatemachineControlDTOAttribute {
+	/**
+	 * The cached value of the '{@link #getAttributeType() <em>Attribute Type</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttributeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineDTOType attributeType;
+
+	/**
+	 * The default value of the '{@link #isHasEvent() <em>Has Event</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasEvent()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean HAS_EVENT_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isHasEvent() <em>Has Event</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasEvent()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean hasEvent = HAS_EVENT_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getEvent() <em>Event</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEvent()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineEvent event;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlDTOAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_DTO_ATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineDTOType getAttributeType() {
+		return attributeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetAttributeType(StatemachineDTOType newAttributeType, NotificationChain msgs) {
+		StatemachineDTOType oldAttributeType = attributeType;
+		attributeType = newAttributeType;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE, oldAttributeType, newAttributeType);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttributeType(StatemachineDTOType newAttributeType) {
+		if (newAttributeType != attributeType) {
+			NotificationChain msgs = null;
+			if (attributeType != null)
+				msgs = ((InternalEObject)attributeType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE, null, msgs);
+			if (newAttributeType != null)
+				msgs = ((InternalEObject)newAttributeType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE, null, msgs);
+			msgs = basicSetAttributeType(newAttributeType, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE, newAttributeType, newAttributeType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isHasEvent() {
+		return hasEvent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHasEvent(boolean newHasEvent) {
+		boolean oldHasEvent = hasEvent;
+		hasEvent = newHasEvent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__HAS_EVENT, oldHasEvent, hasEvent));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent getEvent() {
+		if (event != null && event.eIsProxy()) {
+			InternalEObject oldEvent = (InternalEObject)event;
+			event = (StatemachineEvent)eResolveProxy(oldEvent);
+			if (event != oldEvent) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT, oldEvent, event));
+			}
+		}
+		return event;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent basicGetEvent() {
+		return event;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEvent(StatemachineEvent newEvent) {
+		StatemachineEvent oldEvent = event;
+		event = newEvent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT, oldEvent, event));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE:
+				return basicSetAttributeType(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE:
+				return getAttributeType();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__HAS_EVENT:
+				return isHasEvent();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT:
+				if (resolve) return getEvent();
+				return basicGetEvent();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE:
+				setAttributeType((StatemachineDTOType)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__HAS_EVENT:
+				setHasEvent((Boolean)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT:
+				setEvent((StatemachineEvent)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE:
+				setAttributeType((StatemachineDTOType)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__HAS_EVENT:
+				setHasEvent(HAS_EVENT_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT:
+				setEvent((StatemachineEvent)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE:
+				return attributeType != null;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__HAS_EVENT:
+				return hasEvent != HAS_EVENT_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT:
+				return event != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (hasEvent: ");
+		result.append(hasEvent);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineControlDTOAttributeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlDTOImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlDTOImpl.java
new file mode 100644
index 0000000..8b81531
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlDTOImpl.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control DTO</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlDTOImpl#getDtos <em>Dtos</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlDTOImpl extends StatemachineBaseImpl implements StatemachineControlDTO {
+	/**
+	 * The cached value of the '{@link #getDtos() <em>Dtos</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDtos()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineControlDTOAttribute> dtos;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlDTOImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_DTO;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineControlDTOAttribute> getDtos() {
+		if (dtos == null) {
+			dtos = new EObjectContainmentEList<StatemachineControlDTOAttribute>(StatemachineControlDTOAttribute.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO__DTOS);
+		}
+		return dtos;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO__DTOS:
+				return ((InternalEList<?>)getDtos()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO__DTOS:
+				return getDtos();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO__DTOS:
+				getDtos().clear();
+				getDtos().addAll((Collection<? extends StatemachineControlDTOAttribute>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO__DTOS:
+				getDtos().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO__DTOS:
+				return dtos != null && !dtos.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineControlDTOImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldAttributeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldAttributeImpl.java
new file mode 100644
index 0000000..a62aea2
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldAttributeImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFieldType;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Field Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldAttributeImpl#getAttributeType <em>Attribute Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlFieldAttributeImpl extends StatemachineBaseImpl implements StatemachineControlFieldAttribute {
+	/**
+	 * The cached value of the '{@link #getAttributeType() <em>Attribute Type</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttributeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineFieldType attributeType;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlFieldAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineFieldType getAttributeType() {
+		return attributeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetAttributeType(StatemachineFieldType newAttributeType, NotificationChain msgs) {
+		StatemachineFieldType oldAttributeType = attributeType;
+		attributeType = newAttributeType;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE, oldAttributeType, newAttributeType);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttributeType(StatemachineFieldType newAttributeType) {
+		if (newAttributeType != attributeType) {
+			NotificationChain msgs = null;
+			if (attributeType != null)
+				msgs = ((InternalEObject)attributeType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE, null, msgs);
+			if (newAttributeType != null)
+				msgs = ((InternalEObject)newAttributeType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE, null, msgs);
+			msgs = basicSetAttributeType(newAttributeType, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE, newAttributeType, newAttributeType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE:
+				return basicSetAttributeType(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE:
+				return getAttributeType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE:
+				setAttributeType((StatemachineFieldType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE:
+				setAttributeType((StatemachineFieldType)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE:
+				return attributeType != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineControlFieldAttributeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldImpl.java
new file mode 100644
index 0000000..b43d636
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldImpl.java
@@ -0,0 +1,198 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlField;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Field</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldImpl#getFields <em>Fields</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlFieldImpl#getLayouts <em>Layouts</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlFieldImpl extends StatemachineBaseImpl implements StatemachineControlField {
+	/**
+	 * The cached value of the '{@link #getFields() <em>Fields</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFields()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineControlFieldAttribute> fields;
+
+	/**
+	 * The cached value of the '{@link #getLayouts() <em>Layouts</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLayouts()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineControlFieldLayout> layouts;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlFieldImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_FIELD;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineControlFieldAttribute> getFields() {
+		if (fields == null) {
+			fields = new EObjectContainmentEList<StatemachineControlFieldAttribute>(StatemachineControlFieldAttribute.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__FIELDS);
+		}
+		return fields;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineControlFieldLayout> getLayouts() {
+		if (layouts == null) {
+			layouts = new EObjectContainmentEList<StatemachineControlFieldLayout>(StatemachineControlFieldLayout.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__LAYOUTS);
+		}
+		return layouts;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__FIELDS:
+				return ((InternalEList<?>)getFields()).basicRemove(otherEnd, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__LAYOUTS:
+				return ((InternalEList<?>)getLayouts()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__FIELDS:
+				return getFields();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__LAYOUTS:
+				return getLayouts();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__FIELDS:
+				getFields().clear();
+				getFields().addAll((Collection<? extends StatemachineControlFieldAttribute>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__LAYOUTS:
+				getLayouts().clear();
+				getLayouts().addAll((Collection<? extends StatemachineControlFieldLayout>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__FIELDS:
+				getFields().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__LAYOUTS:
+				getLayouts().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__FIELDS:
+				return fields != null && !fields.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD__LAYOUTS:
+				return layouts != null && !layouts.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineControlFieldImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldLayoutImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldLayoutImpl.java
new file mode 100644
index 0000000..6f9d201
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlFieldLayoutImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Field Layout</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlFieldLayoutImpl extends StatemachineBaseImpl implements StatemachineControlFieldLayout {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlFieldLayoutImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_FIELD_LAYOUT;
+	}
+
+} //StatemachineControlFieldLayoutImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlPeripheralImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlPeripheralImpl.java
new file mode 100644
index 0000000..a7f16bf
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlPeripheralImpl.java
@@ -0,0 +1,272 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Peripheral</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlPeripheralImpl#getLineDisplays <em>Line Displays</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlPeripheralImpl#getPosPrinters <em>Pos Printers</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlPeripheralImpl#getCashDrawers <em>Cash Drawers</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlPeripheralImpl#getPaymentTerminals <em>Payment Terminals</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlPeripheralImpl extends StatemachineBaseImpl implements StatemachineControlPeripheral {
+	/**
+	 * The cached value of the '{@link #getLineDisplays() <em>Line Displays</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLineDisplays()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachinePeripheralDeviceLineDisplay> lineDisplays;
+
+	/**
+	 * The cached value of the '{@link #getPosPrinters() <em>Pos Printers</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPosPrinters()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachinePeripheralDevicePOSPrinter> posPrinters;
+
+	/**
+	 * The cached value of the '{@link #getCashDrawers() <em>Cash Drawers</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCashDrawers()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachinePeripheralDeviceCashDrawer> cashDrawers;
+
+	/**
+	 * The cached value of the '{@link #getPaymentTerminals() <em>Payment Terminals</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPaymentTerminals()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachinePeripheralDevicePT> paymentTerminals;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlPeripheralImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_PERIPHERAL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachinePeripheralDeviceLineDisplay> getLineDisplays() {
+		if (lineDisplays == null) {
+			lineDisplays = new EObjectContainmentEList<StatemachinePeripheralDeviceLineDisplay>(StatemachinePeripheralDeviceLineDisplay.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS);
+		}
+		return lineDisplays;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachinePeripheralDevicePOSPrinter> getPosPrinters() {
+		if (posPrinters == null) {
+			posPrinters = new EObjectContainmentEList<StatemachinePeripheralDevicePOSPrinter>(StatemachinePeripheralDevicePOSPrinter.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS);
+		}
+		return posPrinters;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachinePeripheralDeviceCashDrawer> getCashDrawers() {
+		if (cashDrawers == null) {
+			cashDrawers = new EObjectContainmentEList<StatemachinePeripheralDeviceCashDrawer>(StatemachinePeripheralDeviceCashDrawer.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS);
+		}
+		return cashDrawers;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachinePeripheralDevicePT> getPaymentTerminals() {
+		if (paymentTerminals == null) {
+			paymentTerminals = new EObjectContainmentEList<StatemachinePeripheralDevicePT>(StatemachinePeripheralDevicePT.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS);
+		}
+		return paymentTerminals;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS:
+				return ((InternalEList<?>)getLineDisplays()).basicRemove(otherEnd, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS:
+				return ((InternalEList<?>)getPosPrinters()).basicRemove(otherEnd, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS:
+				return ((InternalEList<?>)getCashDrawers()).basicRemove(otherEnd, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS:
+				return ((InternalEList<?>)getPaymentTerminals()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS:
+				return getLineDisplays();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS:
+				return getPosPrinters();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS:
+				return getCashDrawers();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS:
+				return getPaymentTerminals();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS:
+				getLineDisplays().clear();
+				getLineDisplays().addAll((Collection<? extends StatemachinePeripheralDeviceLineDisplay>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS:
+				getPosPrinters().clear();
+				getPosPrinters().addAll((Collection<? extends StatemachinePeripheralDevicePOSPrinter>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS:
+				getCashDrawers().clear();
+				getCashDrawers().addAll((Collection<? extends StatemachinePeripheralDeviceCashDrawer>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS:
+				getPaymentTerminals().clear();
+				getPaymentTerminals().addAll((Collection<? extends StatemachinePeripheralDevicePT>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS:
+				getLineDisplays().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS:
+				getPosPrinters().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS:
+				getCashDrawers().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS:
+				getPaymentTerminals().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS:
+				return lineDisplays != null && !lineDisplays.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS:
+				return posPrinters != null && !posPrinters.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS:
+				return cashDrawers != null && !cashDrawers.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS:
+				return paymentTerminals != null && !paymentTerminals.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineControlPeripheralImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlSchedulerAttributeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlSchedulerAttributeImpl.java
new file mode 100644
index 0000000..2d4ea7e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlSchedulerAttributeImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Scheduler Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerAttributeImpl#getDelay <em>Delay</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerAttributeImpl#getEvent <em>Event</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlSchedulerAttributeImpl extends StatemachineBaseImpl implements StatemachineControlSchedulerAttribute {
+	/**
+	 * The default value of the '{@link #getDelay() <em>Delay</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDelay()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int DELAY_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getDelay() <em>Delay</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDelay()
+	 * @generated
+	 * @ordered
+	 */
+	protected int delay = DELAY_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getEvent() <em>Event</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEvent()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineEvent event;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlSchedulerAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getDelay() {
+		return delay;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDelay(int newDelay) {
+		int oldDelay = delay;
+		delay = newDelay;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY, oldDelay, delay));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent getEvent() {
+		if (event != null && event.eIsProxy()) {
+			InternalEObject oldEvent = (InternalEObject)event;
+			event = (StatemachineEvent)eResolveProxy(oldEvent);
+			if (event != oldEvent) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT, oldEvent, event));
+			}
+		}
+		return event;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent basicGetEvent() {
+		return event;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEvent(StatemachineEvent newEvent) {
+		StatemachineEvent oldEvent = event;
+		event = newEvent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT, oldEvent, event));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY:
+				return getDelay();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT:
+				if (resolve) return getEvent();
+				return basicGetEvent();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY:
+				setDelay((Integer)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT:
+				setEvent((StatemachineEvent)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY:
+				setDelay(DELAY_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT:
+				setEvent((StatemachineEvent)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY:
+				return delay != DELAY_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT:
+				return event != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (delay: ");
+		result.append(delay);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineControlSchedulerAttributeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlSchedulerImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlSchedulerImpl.java
new file mode 100644
index 0000000..060fdce
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineControlSchedulerImpl.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Control Scheduler</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineControlSchedulerImpl#getSchedulers <em>Schedulers</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineControlSchedulerImpl extends StatemachineBaseImpl implements StatemachineControlScheduler {
+	/**
+	 * The cached value of the '{@link #getSchedulers() <em>Schedulers</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSchedulers()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineControlSchedulerAttribute> schedulers;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineControlSchedulerImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_SCHEDULER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineControlSchedulerAttribute> getSchedulers() {
+		if (schedulers == null) {
+			schedulers = new EObjectContainmentEList<StatemachineControlSchedulerAttribute>(StatemachineControlSchedulerAttribute.class, this, StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS);
+		}
+		return schedulers;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS:
+				return ((InternalEList<?>)getSchedulers()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS:
+				return getSchedulers();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS:
+				getSchedulers().clear();
+				getSchedulers().addAll((Collection<? extends StatemachineControlSchedulerAttribute>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS:
+				getSchedulers().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS:
+				return schedulers != null && !schedulers.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineControlSchedulerImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDSLFactoryImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDSLFactoryImpl.java
new file mode 100644
index 0000000..b082d66
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDSLFactoryImpl.java
@@ -0,0 +1,1276 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.osbp.xtext.statemachine.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StatemachineDSLFactoryImpl extends EFactoryImpl implements StatemachineDSLFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineDSLFactory init() {
+		try {
+			StatemachineDSLFactory theStatemachineDSLFactory = (StatemachineDSLFactory)EPackage.Registry.INSTANCE.getEFactory(StatemachineDSLPackage.eNS_URI);
+			if (theStatemachineDSLFactory != null) {
+				return theStatemachineDSLFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new StatemachineDSLFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineDSLFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case StatemachineDSLPackage.STATEMACHINE_MODEL: return createStatemachineModel();
+			case StatemachineDSLPackage.STATEMACHINE_LAZY_RESOLVER: return createStatemachineLazyResolver();
+			case StatemachineDSLPackage.STATEMACHINE_BASE: return createStatemachineBase();
+			case StatemachineDSLPackage.STATEMACHINE_PACKAGE: return createStatemachinePackage();
+			case StatemachineDSLPackage.STATEMACHINE: return createStatemachine();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON: return createStatemachineControlButton();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD: return createStatemachineControlField();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO: return createStatemachineControlDTO();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER: return createStatemachineControlScheduler();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL: return createStatemachineControlPeripheral();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE: return createStatemachineControlButtonAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD: return createStatemachineControlButtonAttributeEventKeyboard();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY: return createStatemachineControlButtonAttributeEventIdentity();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT: return createStatemachineControlButtonAttributeEventEvent();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE: return createStatemachineControlFieldAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_LAYOUT: return createStatemachineControlFieldLayout();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE: return createStatemachineControlDTOAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY: return createStatemachinePeripheralDeviceLineDisplay();
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER: return createStatemachinePeripheralDevicePOSPrinter();
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER: return createStatemachinePeripheralDeviceCashDrawer();
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_PT: return createStatemachinePeripheralDevicePT();
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE: return createStatemachineControlSchedulerAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_EVENT: return createStatemachineEvent();
+			case StatemachineDSLPackage.STATEMACHINE_STATE: return createStatemachineState();
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER: return createStatemachineTrigger();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE: return createStatemachineActionPeripheralBlinkRate();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR: return createStatemachineActionPeripheralClear();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW: return createStatemachineActionPeripheralCreateWindow();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE: return createStatemachineActionPeripheralCursorType();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW: return createStatemachineActionPeripheralDestroyWindow();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS: return createStatemachineActionPeripheralDeviceBrightness();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP: return createStatemachineActionPeripheralDisplayBitmap();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT: return createStatemachineActionPeripheralDisplayText();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT: return createStatemachineActionPeripheralDisplayTextAt();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT: return createStatemachineActionPeripheralInterCharacterWait();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT: return createStatemachineActionPeripheralMarqueeFormat();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT: return createStatemachineActionPeripheralMarqueeRepeatWait();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE: return createStatemachineActionPeripheralMarqueeType();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT: return createStatemachineActionPeripheralMarqueeUnitWait();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL: return createStatemachineActionPeripheralScroll();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER: return createStatemachineActionPeripheralOpenDrawer();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE: return createStatemachineActionPeripheralPrintBarcode();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP: return createStatemachineActionPeripheralPrintBitmap();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT: return createStatemachineActionPeripheralPrintCut();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP: return createStatemachineActionPeripheralPrintRegisterBitmap();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL: return createStatemachineActionPeripheralPrintNormal();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN: return createStatemachineActionPeripheralPTOpen();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE: return createStatemachineActionPeripheralPTClose();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL: return createStatemachineActionPeripheralPTReversal();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE: return createStatemachineActionPeripheralPTAcknowledge();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION: return createStatemachineActionPeripheralPTRegistration();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION: return createStatemachineActionPeripheralPTAuthorization();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE: return createStatemachineActionPeripheralPTResponse();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT: return createStatemachineActionPeripheralPrintReport();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_STRING: return createStatemachineActionFieldSourceString();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER: return createStatemachineActionFieldSourceNumber();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE: return createStatemachineActionFieldSourceEvaluate();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE: return createStatemachineActionFieldSourceTranslate();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE: return createStatemachineActionFieldSourceDtoAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVENT: return createStatemachineActionFieldSourceEvent();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION: return createStatemachineActionConditionalTransition();
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER: return createStatemachineOperationParameter();
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION: return createStatemachineOperation();
+			case StatemachineDSLPackage.STATEMACHINE_GUARD: return createStatemachineGuard();
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION: return createStatemachineFunction();
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE: return createStatemachineStorageRetrieve();
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE: return createStatemachineStorage();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION: return createStatemachineActionFieldConcatenation();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET: return createStatemachineActionFieldSet();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE: return createStatemachineActionFieldKeystroke();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR: return createStatemachineActionFieldClear();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET: return createStatemachineActionFieldGet();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE: return createStatemachineActionFieldRemove();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE: return createStatemachineActionItemVisible();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE: return createStatemachineActionItemInvisible();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION: return createStatemachineActionButtonCaption();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE: return createStatemachineActionButtonImage();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND: return createStatemachineActionDTOFind();
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER: return createStatemachineActionScheduler();
+			case StatemachineDSLPackage.STATEMACHINE_DTO_TYPE: return createStatemachineDTOType();
+			case StatemachineDSLPackage.STATEMACHINE_FIELD_TYPE: return createStatemachineFieldType();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case StatemachineDSLPackage.STATEMACHINE_INTERNAL_TYPE:
+				return createStatemachineInternalTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_EVENT_TYPE:
+				return createStatemachineControlButtonEventTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_EVALUATION_TYPE:
+				return createStatemachineEvaluationTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_USER_MESSAGE_TYPE:
+				return createStatemachineUserMessageTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_CURSOR_TYPE:
+				return createStatemachineLineDisplayCursorTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_MARQUEE_TYPE:
+				return createStatemachineLineDisplayMarqueeTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_MARQUEE_FORMAT:
+				return createStatemachineLineDisplayMarqueeFormatFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_TEXT_TYPE:
+				return createStatemachineLineDisplayTextTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_SCROLL_TEXT_TYPE:
+				return createStatemachineLineDisplayScrollTextTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.STATEMACHINE_POS_PRINTER_BARCODE_TYPE:
+				return createStatemachinePOSPrinterBarcodeTypeFromString(eDataType, initialValue);
+			case StatemachineDSLPackage.INTERNAL_EOBJECT:
+				return createInternalEObjectFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case StatemachineDSLPackage.STATEMACHINE_INTERNAL_TYPE:
+				return convertStatemachineInternalTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_EVENT_TYPE:
+				return convertStatemachineControlButtonEventTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_EVALUATION_TYPE:
+				return convertStatemachineEvaluationTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_USER_MESSAGE_TYPE:
+				return convertStatemachineUserMessageTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_CURSOR_TYPE:
+				return convertStatemachineLineDisplayCursorTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_MARQUEE_TYPE:
+				return convertStatemachineLineDisplayMarqueeTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_MARQUEE_FORMAT:
+				return convertStatemachineLineDisplayMarqueeFormatToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_TEXT_TYPE:
+				return convertStatemachineLineDisplayTextTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_LINE_DISPLAY_SCROLL_TEXT_TYPE:
+				return convertStatemachineLineDisplayScrollTextTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.STATEMACHINE_POS_PRINTER_BARCODE_TYPE:
+				return convertStatemachinePOSPrinterBarcodeTypeToString(eDataType, instanceValue);
+			case StatemachineDSLPackage.INTERNAL_EOBJECT:
+				return convertInternalEObjectToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineModel createStatemachineModel() {
+		StatemachineModelImpl statemachineModel = new StatemachineModelImpl();
+		return statemachineModel;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLazyResolver createStatemachineLazyResolver() {
+		StatemachineLazyResolverImpl statemachineLazyResolver = new StatemachineLazyResolverImpl();
+		return statemachineLazyResolver;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineBase createStatemachineBase() {
+		StatemachineBaseImpl statemachineBase = new StatemachineBaseImpl();
+		return statemachineBase;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePackage createStatemachinePackage() {
+		StatemachinePackageImpl statemachinePackage = new StatemachinePackageImpl();
+		return statemachinePackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Statemachine createStatemachine() {
+		StatemachineImpl statemachine = new StatemachineImpl();
+		return statemachine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButton createStatemachineControlButton() {
+		StatemachineControlButtonImpl statemachineControlButton = new StatemachineControlButtonImpl();
+		return statemachineControlButton;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlField createStatemachineControlField() {
+		StatemachineControlFieldImpl statemachineControlField = new StatemachineControlFieldImpl();
+		return statemachineControlField;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlDTO createStatemachineControlDTO() {
+		StatemachineControlDTOImpl statemachineControlDTO = new StatemachineControlDTOImpl();
+		return statemachineControlDTO;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlScheduler createStatemachineControlScheduler() {
+		StatemachineControlSchedulerImpl statemachineControlScheduler = new StatemachineControlSchedulerImpl();
+		return statemachineControlScheduler;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlPeripheral createStatemachineControlPeripheral() {
+		StatemachineControlPeripheralImpl statemachineControlPeripheral = new StatemachineControlPeripheralImpl();
+		return statemachineControlPeripheral;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttribute createStatemachineControlButtonAttribute() {
+		StatemachineControlButtonAttributeImpl statemachineControlButtonAttribute = new StatemachineControlButtonAttributeImpl();
+		return statemachineControlButtonAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttributeEventKeyboard createStatemachineControlButtonAttributeEventKeyboard() {
+		StatemachineControlButtonAttributeEventKeyboardImpl statemachineControlButtonAttributeEventKeyboard = new StatemachineControlButtonAttributeEventKeyboardImpl();
+		return statemachineControlButtonAttributeEventKeyboard;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttributeEventIdentity createStatemachineControlButtonAttributeEventIdentity() {
+		StatemachineControlButtonAttributeEventIdentityImpl statemachineControlButtonAttributeEventIdentity = new StatemachineControlButtonAttributeEventIdentityImpl();
+		return statemachineControlButtonAttributeEventIdentity;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonAttributeEventEvent createStatemachineControlButtonAttributeEventEvent() {
+		StatemachineControlButtonAttributeEventEventImpl statemachineControlButtonAttributeEventEvent = new StatemachineControlButtonAttributeEventEventImpl();
+		return statemachineControlButtonAttributeEventEvent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute createStatemachineControlFieldAttribute() {
+		StatemachineControlFieldAttributeImpl statemachineControlFieldAttribute = new StatemachineControlFieldAttributeImpl();
+		return statemachineControlFieldAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldLayout createStatemachineControlFieldLayout() {
+		StatemachineControlFieldLayoutImpl statemachineControlFieldLayout = new StatemachineControlFieldLayoutImpl();
+		return statemachineControlFieldLayout;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlDTOAttribute createStatemachineControlDTOAttribute() {
+		StatemachineControlDTOAttributeImpl statemachineControlDTOAttribute = new StatemachineControlDTOAttributeImpl();
+		return statemachineControlDTOAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceLineDisplay createStatemachinePeripheralDeviceLineDisplay() {
+		StatemachinePeripheralDeviceLineDisplayImpl statemachinePeripheralDeviceLineDisplay = new StatemachinePeripheralDeviceLineDisplayImpl();
+		return statemachinePeripheralDeviceLineDisplay;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePOSPrinter createStatemachinePeripheralDevicePOSPrinter() {
+		StatemachinePeripheralDevicePOSPrinterImpl statemachinePeripheralDevicePOSPrinter = new StatemachinePeripheralDevicePOSPrinterImpl();
+		return statemachinePeripheralDevicePOSPrinter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDeviceCashDrawer createStatemachinePeripheralDeviceCashDrawer() {
+		StatemachinePeripheralDeviceCashDrawerImpl statemachinePeripheralDeviceCashDrawer = new StatemachinePeripheralDeviceCashDrawerImpl();
+		return statemachinePeripheralDeviceCashDrawer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePeripheralDevicePT createStatemachinePeripheralDevicePT() {
+		StatemachinePeripheralDevicePTImpl statemachinePeripheralDevicePT = new StatemachinePeripheralDevicePTImpl();
+		return statemachinePeripheralDevicePT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlSchedulerAttribute createStatemachineControlSchedulerAttribute() {
+		StatemachineControlSchedulerAttributeImpl statemachineControlSchedulerAttribute = new StatemachineControlSchedulerAttributeImpl();
+		return statemachineControlSchedulerAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent createStatemachineEvent() {
+		StatemachineEventImpl statemachineEvent = new StatemachineEventImpl();
+		return statemachineEvent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineState createStatemachineState() {
+		StatemachineStateImpl statemachineState = new StatemachineStateImpl();
+		return statemachineState;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineTrigger createStatemachineTrigger() {
+		StatemachineTriggerImpl statemachineTrigger = new StatemachineTriggerImpl();
+		return statemachineTrigger;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralBlinkRate createStatemachineActionPeripheralBlinkRate() {
+		StatemachineActionPeripheralBlinkRateImpl statemachineActionPeripheralBlinkRate = new StatemachineActionPeripheralBlinkRateImpl();
+		return statemachineActionPeripheralBlinkRate;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralClear createStatemachineActionPeripheralClear() {
+		StatemachineActionPeripheralClearImpl statemachineActionPeripheralClear = new StatemachineActionPeripheralClearImpl();
+		return statemachineActionPeripheralClear;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralCreateWindow createStatemachineActionPeripheralCreateWindow() {
+		StatemachineActionPeripheralCreateWindowImpl statemachineActionPeripheralCreateWindow = new StatemachineActionPeripheralCreateWindowImpl();
+		return statemachineActionPeripheralCreateWindow;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralCursorType createStatemachineActionPeripheralCursorType() {
+		StatemachineActionPeripheralCursorTypeImpl statemachineActionPeripheralCursorType = new StatemachineActionPeripheralCursorTypeImpl();
+		return statemachineActionPeripheralCursorType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralDestroyWindow createStatemachineActionPeripheralDestroyWindow() {
+		StatemachineActionPeripheralDestroyWindowImpl statemachineActionPeripheralDestroyWindow = new StatemachineActionPeripheralDestroyWindowImpl();
+		return statemachineActionPeripheralDestroyWindow;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralDeviceBrightness createStatemachineActionPeripheralDeviceBrightness() {
+		StatemachineActionPeripheralDeviceBrightnessImpl statemachineActionPeripheralDeviceBrightness = new StatemachineActionPeripheralDeviceBrightnessImpl();
+		return statemachineActionPeripheralDeviceBrightness;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralDisplayBitmap createStatemachineActionPeripheralDisplayBitmap() {
+		StatemachineActionPeripheralDisplayBitmapImpl statemachineActionPeripheralDisplayBitmap = new StatemachineActionPeripheralDisplayBitmapImpl();
+		return statemachineActionPeripheralDisplayBitmap;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralDisplayText createStatemachineActionPeripheralDisplayText() {
+		StatemachineActionPeripheralDisplayTextImpl statemachineActionPeripheralDisplayText = new StatemachineActionPeripheralDisplayTextImpl();
+		return statemachineActionPeripheralDisplayText;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralDisplayTextAt createStatemachineActionPeripheralDisplayTextAt() {
+		StatemachineActionPeripheralDisplayTextAtImpl statemachineActionPeripheralDisplayTextAt = new StatemachineActionPeripheralDisplayTextAtImpl();
+		return statemachineActionPeripheralDisplayTextAt;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralInterCharacterWait createStatemachineActionPeripheralInterCharacterWait() {
+		StatemachineActionPeripheralInterCharacterWaitImpl statemachineActionPeripheralInterCharacterWait = new StatemachineActionPeripheralInterCharacterWaitImpl();
+		return statemachineActionPeripheralInterCharacterWait;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralMarqueeFormat createStatemachineActionPeripheralMarqueeFormat() {
+		StatemachineActionPeripheralMarqueeFormatImpl statemachineActionPeripheralMarqueeFormat = new StatemachineActionPeripheralMarqueeFormatImpl();
+		return statemachineActionPeripheralMarqueeFormat;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralMarqueeRepeatWait createStatemachineActionPeripheralMarqueeRepeatWait() {
+		StatemachineActionPeripheralMarqueeRepeatWaitImpl statemachineActionPeripheralMarqueeRepeatWait = new StatemachineActionPeripheralMarqueeRepeatWaitImpl();
+		return statemachineActionPeripheralMarqueeRepeatWait;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralMarqueeType createStatemachineActionPeripheralMarqueeType() {
+		StatemachineActionPeripheralMarqueeTypeImpl statemachineActionPeripheralMarqueeType = new StatemachineActionPeripheralMarqueeTypeImpl();
+		return statemachineActionPeripheralMarqueeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralMarqueeUnitWait createStatemachineActionPeripheralMarqueeUnitWait() {
+		StatemachineActionPeripheralMarqueeUnitWaitImpl statemachineActionPeripheralMarqueeUnitWait = new StatemachineActionPeripheralMarqueeUnitWaitImpl();
+		return statemachineActionPeripheralMarqueeUnitWait;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralScroll createStatemachineActionPeripheralScroll() {
+		StatemachineActionPeripheralScrollImpl statemachineActionPeripheralScroll = new StatemachineActionPeripheralScrollImpl();
+		return statemachineActionPeripheralScroll;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralOpenDrawer createStatemachineActionPeripheralOpenDrawer() {
+		StatemachineActionPeripheralOpenDrawerImpl statemachineActionPeripheralOpenDrawer = new StatemachineActionPeripheralOpenDrawerImpl();
+		return statemachineActionPeripheralOpenDrawer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPrintBarcode createStatemachineActionPeripheralPrintBarcode() {
+		StatemachineActionPeripheralPrintBarcodeImpl statemachineActionPeripheralPrintBarcode = new StatemachineActionPeripheralPrintBarcodeImpl();
+		return statemachineActionPeripheralPrintBarcode;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPrintBitmap createStatemachineActionPeripheralPrintBitmap() {
+		StatemachineActionPeripheralPrintBitmapImpl statemachineActionPeripheralPrintBitmap = new StatemachineActionPeripheralPrintBitmapImpl();
+		return statemachineActionPeripheralPrintBitmap;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPrintCut createStatemachineActionPeripheralPrintCut() {
+		StatemachineActionPeripheralPrintCutImpl statemachineActionPeripheralPrintCut = new StatemachineActionPeripheralPrintCutImpl();
+		return statemachineActionPeripheralPrintCut;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPrintRegisterBitmap createStatemachineActionPeripheralPrintRegisterBitmap() {
+		StatemachineActionPeripheralPrintRegisterBitmapImpl statemachineActionPeripheralPrintRegisterBitmap = new StatemachineActionPeripheralPrintRegisterBitmapImpl();
+		return statemachineActionPeripheralPrintRegisterBitmap;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPrintNormal createStatemachineActionPeripheralPrintNormal() {
+		StatemachineActionPeripheralPrintNormalImpl statemachineActionPeripheralPrintNormal = new StatemachineActionPeripheralPrintNormalImpl();
+		return statemachineActionPeripheralPrintNormal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPTOpen createStatemachineActionPeripheralPTOpen() {
+		StatemachineActionPeripheralPTOpenImpl statemachineActionPeripheralPTOpen = new StatemachineActionPeripheralPTOpenImpl();
+		return statemachineActionPeripheralPTOpen;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPTClose createStatemachineActionPeripheralPTClose() {
+		StatemachineActionPeripheralPTCloseImpl statemachineActionPeripheralPTClose = new StatemachineActionPeripheralPTCloseImpl();
+		return statemachineActionPeripheralPTClose;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPTReversal createStatemachineActionPeripheralPTReversal() {
+		StatemachineActionPeripheralPTReversalImpl statemachineActionPeripheralPTReversal = new StatemachineActionPeripheralPTReversalImpl();
+		return statemachineActionPeripheralPTReversal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPTAcknowledge createStatemachineActionPeripheralPTAcknowledge() {
+		StatemachineActionPeripheralPTAcknowledgeImpl statemachineActionPeripheralPTAcknowledge = new StatemachineActionPeripheralPTAcknowledgeImpl();
+		return statemachineActionPeripheralPTAcknowledge;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPTRegistration createStatemachineActionPeripheralPTRegistration() {
+		StatemachineActionPeripheralPTRegistrationImpl statemachineActionPeripheralPTRegistration = new StatemachineActionPeripheralPTRegistrationImpl();
+		return statemachineActionPeripheralPTRegistration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPTAuthorization createStatemachineActionPeripheralPTAuthorization() {
+		StatemachineActionPeripheralPTAuthorizationImpl statemachineActionPeripheralPTAuthorization = new StatemachineActionPeripheralPTAuthorizationImpl();
+		return statemachineActionPeripheralPTAuthorization;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPTResponse createStatemachineActionPeripheralPTResponse() {
+		StatemachineActionPeripheralPTResponseImpl statemachineActionPeripheralPTResponse = new StatemachineActionPeripheralPTResponseImpl();
+		return statemachineActionPeripheralPTResponse;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionPeripheralPrintReport createStatemachineActionPeripheralPrintReport() {
+		StatemachineActionPeripheralPrintReportImpl statemachineActionPeripheralPrintReport = new StatemachineActionPeripheralPrintReportImpl();
+		return statemachineActionPeripheralPrintReport;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldSourceString createStatemachineActionFieldSourceString() {
+		StatemachineActionFieldSourceStringImpl statemachineActionFieldSourceString = new StatemachineActionFieldSourceStringImpl();
+		return statemachineActionFieldSourceString;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldSourceNumber createStatemachineActionFieldSourceNumber() {
+		StatemachineActionFieldSourceNumberImpl statemachineActionFieldSourceNumber = new StatemachineActionFieldSourceNumberImpl();
+		return statemachineActionFieldSourceNumber;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldSourceEvaluate createStatemachineActionFieldSourceEvaluate() {
+		StatemachineActionFieldSourceEvaluateImpl statemachineActionFieldSourceEvaluate = new StatemachineActionFieldSourceEvaluateImpl();
+		return statemachineActionFieldSourceEvaluate;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldSourceTranslate createStatemachineActionFieldSourceTranslate() {
+		StatemachineActionFieldSourceTranslateImpl statemachineActionFieldSourceTranslate = new StatemachineActionFieldSourceTranslateImpl();
+		return statemachineActionFieldSourceTranslate;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldSourceDtoAttribute createStatemachineActionFieldSourceDtoAttribute() {
+		StatemachineActionFieldSourceDtoAttributeImpl statemachineActionFieldSourceDtoAttribute = new StatemachineActionFieldSourceDtoAttributeImpl();
+		return statemachineActionFieldSourceDtoAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldSourceEvent createStatemachineActionFieldSourceEvent() {
+		StatemachineActionFieldSourceEventImpl statemachineActionFieldSourceEvent = new StatemachineActionFieldSourceEventImpl();
+		return statemachineActionFieldSourceEvent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionConditionalTransition createStatemachineActionConditionalTransition() {
+		StatemachineActionConditionalTransitionImpl statemachineActionConditionalTransition = new StatemachineActionConditionalTransitionImpl();
+		return statemachineActionConditionalTransition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineOperationParameter createStatemachineOperationParameter() {
+		StatemachineOperationParameterImpl statemachineOperationParameter = new StatemachineOperationParameterImpl();
+		return statemachineOperationParameter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineOperation createStatemachineOperation() {
+		StatemachineOperationImpl statemachineOperation = new StatemachineOperationImpl();
+		return statemachineOperation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineGuard createStatemachineGuard() {
+		StatemachineGuardImpl statemachineGuard = new StatemachineGuardImpl();
+		return statemachineGuard;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineFunction createStatemachineFunction() {
+		StatemachineFunctionImpl statemachineFunction = new StatemachineFunctionImpl();
+		return statemachineFunction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineStorageRetrieve createStatemachineStorageRetrieve() {
+		StatemachineStorageRetrieveImpl statemachineStorageRetrieve = new StatemachineStorageRetrieveImpl();
+		return statemachineStorageRetrieve;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineStorage createStatemachineStorage() {
+		StatemachineStorageImpl statemachineStorage = new StatemachineStorageImpl();
+		return statemachineStorage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation createStatemachineActionFieldConcatenation() {
+		StatemachineActionFieldConcatenationImpl statemachineActionFieldConcatenation = new StatemachineActionFieldConcatenationImpl();
+		return statemachineActionFieldConcatenation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldSet createStatemachineActionFieldSet() {
+		StatemachineActionFieldSetImpl statemachineActionFieldSet = new StatemachineActionFieldSetImpl();
+		return statemachineActionFieldSet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldKeystroke createStatemachineActionFieldKeystroke() {
+		StatemachineActionFieldKeystrokeImpl statemachineActionFieldKeystroke = new StatemachineActionFieldKeystrokeImpl();
+		return statemachineActionFieldKeystroke;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldClear createStatemachineActionFieldClear() {
+		StatemachineActionFieldClearImpl statemachineActionFieldClear = new StatemachineActionFieldClearImpl();
+		return statemachineActionFieldClear;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldGet createStatemachineActionFieldGet() {
+		StatemachineActionFieldGetImpl statemachineActionFieldGet = new StatemachineActionFieldGetImpl();
+		return statemachineActionFieldGet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldRemove createStatemachineActionFieldRemove() {
+		StatemachineActionFieldRemoveImpl statemachineActionFieldRemove = new StatemachineActionFieldRemoveImpl();
+		return statemachineActionFieldRemove;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionItemVisible createStatemachineActionItemVisible() {
+		StatemachineActionItemVisibleImpl statemachineActionItemVisible = new StatemachineActionItemVisibleImpl();
+		return statemachineActionItemVisible;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionItemInvisible createStatemachineActionItemInvisible() {
+		StatemachineActionItemInvisibleImpl statemachineActionItemInvisible = new StatemachineActionItemInvisibleImpl();
+		return statemachineActionItemInvisible;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionButtonCaption createStatemachineActionButtonCaption() {
+		StatemachineActionButtonCaptionImpl statemachineActionButtonCaption = new StatemachineActionButtonCaptionImpl();
+		return statemachineActionButtonCaption;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionButtonImage createStatemachineActionButtonImage() {
+		StatemachineActionButtonImageImpl statemachineActionButtonImage = new StatemachineActionButtonImageImpl();
+		return statemachineActionButtonImage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionDTOFind createStatemachineActionDTOFind() {
+		StatemachineActionDTOFindImpl statemachineActionDTOFind = new StatemachineActionDTOFindImpl();
+		return statemachineActionDTOFind;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionScheduler createStatemachineActionScheduler() {
+		StatemachineActionSchedulerImpl statemachineActionScheduler = new StatemachineActionSchedulerImpl();
+		return statemachineActionScheduler;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineDTOType createStatemachineDTOType() {
+		StatemachineDTOTypeImpl statemachineDTOType = new StatemachineDTOTypeImpl();
+		return statemachineDTOType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineFieldType createStatemachineFieldType() {
+		StatemachineFieldTypeImpl statemachineFieldType = new StatemachineFieldTypeImpl();
+		return statemachineFieldType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineInternalType createStatemachineInternalTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachineInternalType result = StatemachineInternalType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineInternalTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlButtonEventType createStatemachineControlButtonEventTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachineControlButtonEventType result = StatemachineControlButtonEventType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineControlButtonEventTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvaluationType createStatemachineEvaluationTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachineEvaluationType result = StatemachineEvaluationType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineEvaluationTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineUserMessageType createStatemachineUserMessageTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachineUserMessageType result = StatemachineUserMessageType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineUserMessageTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayCursorType createStatemachineLineDisplayCursorTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachineLineDisplayCursorType result = StatemachineLineDisplayCursorType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineLineDisplayCursorTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayMarqueeType createStatemachineLineDisplayMarqueeTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachineLineDisplayMarqueeType result = StatemachineLineDisplayMarqueeType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineLineDisplayMarqueeTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayMarqueeFormat createStatemachineLineDisplayMarqueeFormatFromString(EDataType eDataType, String initialValue) {
+		StatemachineLineDisplayMarqueeFormat result = StatemachineLineDisplayMarqueeFormat.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineLineDisplayMarqueeFormatToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayTextType createStatemachineLineDisplayTextTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachineLineDisplayTextType result = StatemachineLineDisplayTextType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineLineDisplayTextTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineLineDisplayScrollTextType createStatemachineLineDisplayScrollTextTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachineLineDisplayScrollTextType result = StatemachineLineDisplayScrollTextType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachineLineDisplayScrollTextTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePOSPrinterBarcodeType createStatemachinePOSPrinterBarcodeTypeFromString(EDataType eDataType, String initialValue) {
+		StatemachinePOSPrinterBarcodeType result = StatemachinePOSPrinterBarcodeType.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertStatemachinePOSPrinterBarcodeTypeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InternalEObject createInternalEObjectFromString(EDataType eDataType, String initialValue) {
+		return (InternalEObject)super.createFromString(eDataType, initialValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertInternalEObjectToString(EDataType eDataType, Object instanceValue) {
+		return super.convertToString(eDataType, instanceValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineDSLPackage getStatemachineDSLPackage() {
+		return (StatemachineDSLPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static StatemachineDSLPackage getPackage() {
+		return StatemachineDSLPackage.eINSTANCE;
+	}
+
+} //StatemachineDSLFactoryImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDSLPackageImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDSLPackageImpl.java
new file mode 100644
index 0000000..485f6a1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDSLPackageImpl.java
@@ -0,0 +1,4211 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;
+
+import org.eclipse.osbp.dsl.semantic.dto.OSBPDtoPackage;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDSLPackage;
+
+import org.eclipse.osbp.xtext.reportdsl.ReportDSLPackage;
+
+import org.eclipse.osbp.xtext.statemachine.Statemachine;
+import org.eclipse.osbp.xtext.statemachine.StatemachineAction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineBase;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControl;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButton;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonEventType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlField;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLFactory;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDTOType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFieldType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFunction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineGuard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineInternalType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLazyResolver;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineModel;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+import org.eclipse.osbp.xtext.statemachine.StatemachineState;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve;
+import org.eclipse.osbp.xtext.statemachine.StatemachineTrigger;
+import org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StatemachineDSLPackageImpl extends EPackageImpl implements StatemachineDSLPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineModelEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineLazyResolverEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineBaseEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachinePackageEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlButtonEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlFieldEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlDTOEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlSchedulerEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlPeripheralEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlButtonAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlButtonAttributeEventEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlButtonAttributeEventKeyboardEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlButtonAttributeEventIdentityEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlButtonAttributeEventEventEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlVisibilityEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlFieldAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlFieldLayoutEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlDTOAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachinePeripheralDeviceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachinePeripheralDeviceLineDisplayEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachinePeripheralDevicePOSPrinterEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachinePeripheralDeviceCashDrawerEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachinePeripheralDevicePTEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineControlSchedulerAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineEventEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineStateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineTriggerEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralBlinkRateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralClearEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralCreateWindowEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralCursorTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralDestroyWindowEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralDeviceBrightnessEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralDisplayBitmapEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralDisplayTextEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralDisplayTextAtEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralInterCharacterWaitEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralMarqueeFormatEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralMarqueeRepeatWaitEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralMarqueeTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralMarqueeUnitWaitEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralScrollEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralOpenDrawerEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPrintBarcodeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPrintBitmapEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPrintCutEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPrintRegisterBitmapEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPrintNormalEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPTOpenEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPTCloseEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPTReversalEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPTAcknowledgeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPTRegistrationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPTAuthorizationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPTResponseEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionPeripheralPrintReportEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldSourceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldSourceStringEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldSourceNumberEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldSourceEvaluateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldSourceTranslateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldSourceDtoAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldSourceEventEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionConditionalTransitionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineOperationParameterEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineOperationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineGuardEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineFunctionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineStorageRetrieveEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineStorageEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldConcatenationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldSetEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldKeystrokeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldClearEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldGetEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionFieldRemoveEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionItemVisibleEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionItemInvisibleEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionButtonCaptionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionButtonImageEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionDTOFindEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineActionSchedulerEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineDTOTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineFieldTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineInternalTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineControlButtonEventTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineEvaluationTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineUserMessageTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineLineDisplayCursorTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineLineDisplayMarqueeTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineLineDisplayMarqueeFormatEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineLineDisplayTextTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachineLineDisplayScrollTextTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum statemachinePOSPrinterBarcodeTypeEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EDataType internalEObjectEDataType = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private StatemachineDSLPackageImpl() {
+		super(eNS_URI, StatemachineDSLFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link StatemachineDSLPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static StatemachineDSLPackage init() {
+		if (isInited) return (StatemachineDSLPackage)EPackage.Registry.INSTANCE.getEPackage(StatemachineDSLPackage.eNS_URI);
+
+		// Obtain or create and register package
+		StatemachineDSLPackageImpl theStatemachineDSLPackage = (StatemachineDSLPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof StatemachineDSLPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new StatemachineDSLPackageImpl());
+
+		isInited = true;
+
+		// Initialize simple dependencies
+		ReportDSLPackage.eINSTANCE.eClass();
+
+		// Create package meta-data objects
+		theStatemachineDSLPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theStatemachineDSLPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theStatemachineDSLPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(StatemachineDSLPackage.eNS_URI, theStatemachineDSLPackage);
+		return theStatemachineDSLPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineModel() {
+		return statemachineModelEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineModel_Packages() {
+		return (EReference)statemachineModelEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineLazyResolver() {
+		return statemachineLazyResolverEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getStatemachineLazyResolver__EResolveProxy__InternalEObject() {
+		return statemachineLazyResolverEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineBase() {
+		return statemachineBaseEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineBase_Name() {
+		return (EAttribute)statemachineBaseEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachinePackage() {
+		return statemachinePackageEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachinePackage_Statemachines() {
+		return (EReference)statemachinePackageEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachine() {
+		return statemachineEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachine_Description() {
+		return (EAttribute)statemachineEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachine_DescriptionValue() {
+		return (EAttribute)statemachineEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachine_FunctionGroup() {
+		return (EReference)statemachineEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachine_InitialEvent() {
+		return (EReference)statemachineEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachine_InitialState() {
+		return (EReference)statemachineEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachine_Events() {
+		return (EReference)statemachineEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachine_Controls() {
+		return (EReference)statemachineEClass.getEStructuralFeatures().get(6);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachine_States() {
+		return (EReference)statemachineEClass.getEStructuralFeatures().get(7);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControl() {
+		return statemachineControlEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlButton() {
+		return statemachineControlButtonEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineControlButton_EventType() {
+		return (EAttribute)statemachineControlButtonEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlButton_Buttons() {
+		return (EReference)statemachineControlButtonEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlField() {
+		return statemachineControlFieldEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlField_Fields() {
+		return (EReference)statemachineControlFieldEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlField_Layouts() {
+		return (EReference)statemachineControlFieldEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlDTO() {
+		return statemachineControlDTOEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlDTO_Dtos() {
+		return (EReference)statemachineControlDTOEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlScheduler() {
+		return statemachineControlSchedulerEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlScheduler_Schedulers() {
+		return (EReference)statemachineControlSchedulerEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlPeripheral() {
+		return statemachineControlPeripheralEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlPeripheral_LineDisplays() {
+		return (EReference)statemachineControlPeripheralEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlPeripheral_PosPrinters() {
+		return (EReference)statemachineControlPeripheralEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlPeripheral_CashDrawers() {
+		return (EReference)statemachineControlPeripheralEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlPeripheral_PaymentTerminals() {
+		return (EReference)statemachineControlPeripheralEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlButtonAttribute() {
+		return statemachineControlButtonAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineControlButtonAttribute_HasImage() {
+		return (EAttribute)statemachineControlButtonAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineControlButtonAttribute_Image() {
+		return (EAttribute)statemachineControlButtonAttributeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlButtonAttribute_Event() {
+		return (EReference)statemachineControlButtonAttributeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlButtonAttributeEvent() {
+		return statemachineControlButtonAttributeEventEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlButtonAttributeEventKeyboard() {
+		return statemachineControlButtonAttributeEventKeyboardEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineControlButtonAttributeEventKeyboard_Keystroke() {
+		return (EAttribute)statemachineControlButtonAttributeEventKeyboardEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlButtonAttributeEventIdentity() {
+		return statemachineControlButtonAttributeEventIdentityEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineControlButtonAttributeEventIdentity_Identity() {
+		return (EAttribute)statemachineControlButtonAttributeEventIdentityEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlButtonAttributeEventEvent() {
+		return statemachineControlButtonAttributeEventEventEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlButtonAttributeEventEvent_Event() {
+		return (EReference)statemachineControlButtonAttributeEventEventEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlVisibility() {
+		return statemachineControlVisibilityEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlFieldAttribute() {
+		return statemachineControlFieldAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlFieldAttribute_AttributeType() {
+		return (EReference)statemachineControlFieldAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlFieldLayout() {
+		return statemachineControlFieldLayoutEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlDTOAttribute() {
+		return statemachineControlDTOAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlDTOAttribute_AttributeType() {
+		return (EReference)statemachineControlDTOAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineControlDTOAttribute_HasEvent() {
+		return (EAttribute)statemachineControlDTOAttributeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlDTOAttribute_Event() {
+		return (EReference)statemachineControlDTOAttributeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachinePeripheralDevice() {
+		return statemachinePeripheralDeviceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachinePeripheralDeviceLineDisplay() {
+		return statemachinePeripheralDeviceLineDisplayEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachinePeripheralDevicePOSPrinter() {
+		return statemachinePeripheralDevicePOSPrinterEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachinePeripheralDeviceCashDrawer() {
+		return statemachinePeripheralDeviceCashDrawerEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachinePeripheralDevicePT() {
+		return statemachinePeripheralDevicePTEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineControlSchedulerAttribute() {
+		return statemachineControlSchedulerAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineControlSchedulerAttribute_Delay() {
+		return (EAttribute)statemachineControlSchedulerAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineControlSchedulerAttribute_Event() {
+		return (EReference)statemachineControlSchedulerAttributeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineEvent() {
+		return statemachineEventEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineState() {
+		return statemachineStateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineState_Triggers() {
+		return (EReference)statemachineStateEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineState_Identity() {
+		return (EReference)statemachineStateEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineState_Keystroke() {
+		return (EReference)statemachineStateEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineState_HasKeyOperation() {
+		return (EAttribute)statemachineStateEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineState_KeyOperation() {
+		return (EReference)statemachineStateEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineTrigger() {
+		return statemachineTriggerEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineTrigger_HasTransition() {
+		return (EAttribute)statemachineTriggerEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineTrigger_Transition() {
+		return (EReference)statemachineTriggerEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineTrigger_Triggers() {
+		return (EReference)statemachineTriggerEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineTrigger_Guards() {
+		return (EReference)statemachineTriggerEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineTrigger_Actions() {
+		return (EReference)statemachineTriggerEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineAction() {
+		return statemachineActionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralBlinkRate() {
+		return statemachineActionPeripheralBlinkRateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralBlinkRate_Device() {
+		return (EReference)statemachineActionPeripheralBlinkRateEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralBlinkRate_BlinkRate() {
+		return (EAttribute)statemachineActionPeripheralBlinkRateEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralClear() {
+		return statemachineActionPeripheralClearEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralClear_Device() {
+		return (EReference)statemachineActionPeripheralClearEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralCreateWindow() {
+		return statemachineActionPeripheralCreateWindowEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralCreateWindow_Device() {
+		return (EReference)statemachineActionPeripheralCreateWindowEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralCreateWindow_ViewportRow() {
+		return (EAttribute)statemachineActionPeripheralCreateWindowEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralCreateWindow_ViewportColumn() {
+		return (EAttribute)statemachineActionPeripheralCreateWindowEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralCreateWindow_ViewportHeight() {
+		return (EAttribute)statemachineActionPeripheralCreateWindowEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralCreateWindow_ViewportWidth() {
+		return (EAttribute)statemachineActionPeripheralCreateWindowEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralCreateWindow_WindowHeight() {
+		return (EAttribute)statemachineActionPeripheralCreateWindowEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralCreateWindow_WindowWidth() {
+		return (EAttribute)statemachineActionPeripheralCreateWindowEClass.getEStructuralFeatures().get(6);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralCursorType() {
+		return statemachineActionPeripheralCursorTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralCursorType_Device() {
+		return (EReference)statemachineActionPeripheralCursorTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralCursorType_CursorType() {
+		return (EAttribute)statemachineActionPeripheralCursorTypeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralDestroyWindow() {
+		return statemachineActionPeripheralDestroyWindowEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralDestroyWindow_Device() {
+		return (EReference)statemachineActionPeripheralDestroyWindowEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralDeviceBrightness() {
+		return statemachineActionPeripheralDeviceBrightnessEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralDeviceBrightness_Device() {
+		return (EReference)statemachineActionPeripheralDeviceBrightnessEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralDeviceBrightness_Brightness() {
+		return (EAttribute)statemachineActionPeripheralDeviceBrightnessEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralDisplayBitmap() {
+		return statemachineActionPeripheralDisplayBitmapEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralDisplayBitmap_Device() {
+		return (EReference)statemachineActionPeripheralDisplayBitmapEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralDisplayBitmap_BitmapId() {
+		return (EAttribute)statemachineActionPeripheralDisplayBitmapEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralDisplayText() {
+		return statemachineActionPeripheralDisplayTextEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralDisplayText_Device() {
+		return (EReference)statemachineActionPeripheralDisplayTextEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralDisplayText_Text() {
+		return (EReference)statemachineActionPeripheralDisplayTextEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralDisplayText_HasType() {
+		return (EAttribute)statemachineActionPeripheralDisplayTextEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralDisplayText_TextType() {
+		return (EAttribute)statemachineActionPeripheralDisplayTextEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralDisplayTextAt() {
+		return statemachineActionPeripheralDisplayTextAtEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralDisplayTextAt_Device() {
+		return (EReference)statemachineActionPeripheralDisplayTextAtEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralDisplayTextAt_Row() {
+		return (EAttribute)statemachineActionPeripheralDisplayTextAtEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralDisplayTextAt_Column() {
+		return (EAttribute)statemachineActionPeripheralDisplayTextAtEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralDisplayTextAt_Text() {
+		return (EReference)statemachineActionPeripheralDisplayTextAtEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralDisplayTextAt_HasType() {
+		return (EAttribute)statemachineActionPeripheralDisplayTextAtEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralDisplayTextAt_TextType() {
+		return (EAttribute)statemachineActionPeripheralDisplayTextAtEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralInterCharacterWait() {
+		return statemachineActionPeripheralInterCharacterWaitEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralInterCharacterWait_Device() {
+		return (EReference)statemachineActionPeripheralInterCharacterWaitEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralInterCharacterWait_Wait() {
+		return (EAttribute)statemachineActionPeripheralInterCharacterWaitEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralMarqueeFormat() {
+		return statemachineActionPeripheralMarqueeFormatEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralMarqueeFormat_Device() {
+		return (EReference)statemachineActionPeripheralMarqueeFormatEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralMarqueeFormat_Format() {
+		return (EAttribute)statemachineActionPeripheralMarqueeFormatEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralMarqueeRepeatWait() {
+		return statemachineActionPeripheralMarqueeRepeatWaitEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralMarqueeRepeatWait_Device() {
+		return (EReference)statemachineActionPeripheralMarqueeRepeatWaitEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralMarqueeRepeatWait_Wait() {
+		return (EAttribute)statemachineActionPeripheralMarqueeRepeatWaitEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralMarqueeType() {
+		return statemachineActionPeripheralMarqueeTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralMarqueeType_Device() {
+		return (EReference)statemachineActionPeripheralMarqueeTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralMarqueeType_MarqueeType() {
+		return (EAttribute)statemachineActionPeripheralMarqueeTypeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralMarqueeUnitWait() {
+		return statemachineActionPeripheralMarqueeUnitWaitEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralMarqueeUnitWait_Device() {
+		return (EReference)statemachineActionPeripheralMarqueeUnitWaitEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralMarqueeUnitWait_Wait() {
+		return (EAttribute)statemachineActionPeripheralMarqueeUnitWaitEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralScroll() {
+		return statemachineActionPeripheralScrollEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralScroll_Device() {
+		return (EReference)statemachineActionPeripheralScrollEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralScroll_Direction() {
+		return (EAttribute)statemachineActionPeripheralScrollEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralScroll_Units() {
+		return (EAttribute)statemachineActionPeripheralScrollEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralOpenDrawer() {
+		return statemachineActionPeripheralOpenDrawerEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralOpenDrawer_Device() {
+		return (EReference)statemachineActionPeripheralOpenDrawerEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPrintBarcode() {
+		return statemachineActionPeripheralPrintBarcodeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintBarcode_Device() {
+		return (EReference)statemachineActionPeripheralPrintBarcodeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralPrintBarcode_Data() {
+		return (EAttribute)statemachineActionPeripheralPrintBarcodeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralPrintBarcode_BarcodeType() {
+		return (EAttribute)statemachineActionPeripheralPrintBarcodeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPrintBitmap() {
+		return statemachineActionPeripheralPrintBitmapEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintBitmap_Device() {
+		return (EReference)statemachineActionPeripheralPrintBitmapEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralPrintBitmap_BitmapId() {
+		return (EAttribute)statemachineActionPeripheralPrintBitmapEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPrintCut() {
+		return statemachineActionPeripheralPrintCutEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintCut_Device() {
+		return (EReference)statemachineActionPeripheralPrintCutEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintCut_Text() {
+		return (EReference)statemachineActionPeripheralPrintCutEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPrintRegisterBitmap() {
+		return statemachineActionPeripheralPrintRegisterBitmapEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintRegisterBitmap_Device() {
+		return (EReference)statemachineActionPeripheralPrintRegisterBitmapEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralPrintRegisterBitmap_BitmapId() {
+		return (EAttribute)statemachineActionPeripheralPrintRegisterBitmapEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralPrintRegisterBitmap_Name() {
+		return (EAttribute)statemachineActionPeripheralPrintRegisterBitmapEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPrintNormal() {
+		return statemachineActionPeripheralPrintNormalEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintNormal_Device() {
+		return (EReference)statemachineActionPeripheralPrintNormalEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintNormal_Text() {
+		return (EReference)statemachineActionPeripheralPrintNormalEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralPrintNormal_BarcodeType() {
+		return (EAttribute)statemachineActionPeripheralPrintNormalEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPTOpen() {
+		return statemachineActionPeripheralPTOpenEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTOpen_Device() {
+		return (EReference)statemachineActionPeripheralPTOpenEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTOpen_Host() {
+		return (EReference)statemachineActionPeripheralPTOpenEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTOpen_Port() {
+		return (EReference)statemachineActionPeripheralPTOpenEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPTClose() {
+		return statemachineActionPeripheralPTCloseEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTClose_Device() {
+		return (EReference)statemachineActionPeripheralPTCloseEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPTReversal() {
+		return statemachineActionPeripheralPTReversalEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTReversal_Device() {
+		return (EReference)statemachineActionPeripheralPTReversalEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTReversal_Password() {
+		return (EReference)statemachineActionPeripheralPTReversalEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTReversal_Receipt() {
+		return (EReference)statemachineActionPeripheralPTReversalEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPTAcknowledge() {
+		return statemachineActionPeripheralPTAcknowledgeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTAcknowledge_Device() {
+		return (EReference)statemachineActionPeripheralPTAcknowledgeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPTRegistration() {
+		return statemachineActionPeripheralPTRegistrationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTRegistration_Device() {
+		return (EReference)statemachineActionPeripheralPTRegistrationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTRegistration_Password() {
+		return (EReference)statemachineActionPeripheralPTRegistrationEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralPTRegistration_Configuration() {
+		return (EAttribute)statemachineActionPeripheralPTRegistrationEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPTAuthorization() {
+		return statemachineActionPeripheralPTAuthorizationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTAuthorization_Device() {
+		return (EReference)statemachineActionPeripheralPTAuthorizationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTAuthorization_Amount() {
+		return (EReference)statemachineActionPeripheralPTAuthorizationEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPTResponse() {
+		return statemachineActionPeripheralPTResponseEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPTResponse_Device() {
+		return (EReference)statemachineActionPeripheralPTResponseEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionPeripheralPrintReport() {
+		return statemachineActionPeripheralPrintReportEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintReport_Report() {
+		return (EReference)statemachineActionPeripheralPrintReportEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionPeripheralPrintReport_Key() {
+		return (EReference)statemachineActionPeripheralPrintReportEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionPeripheralPrintReport_HasFilter() {
+		return (EAttribute)statemachineActionPeripheralPrintReportEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldSource() {
+		return statemachineActionFieldSourceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldSourceString() {
+		return statemachineActionFieldSourceStringEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionFieldSourceString_Text() {
+		return (EAttribute)statemachineActionFieldSourceStringEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldSourceNumber() {
+		return statemachineActionFieldSourceNumberEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionFieldSourceNumber_Value() {
+		return (EAttribute)statemachineActionFieldSourceNumberEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldSourceEvaluate() {
+		return statemachineActionFieldSourceEvaluateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionFieldSourceEvaluate_Evaluationtype() {
+		return (EAttribute)statemachineActionFieldSourceEvaluateEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldSourceTranslate() {
+		return statemachineActionFieldSourceTranslateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionFieldSourceTranslate_Text() {
+		return (EAttribute)statemachineActionFieldSourceTranslateEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldSourceDtoAttribute() {
+		return statemachineActionFieldSourceDtoAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldSourceDtoAttribute_Dto() {
+		return (EReference)statemachineActionFieldSourceDtoAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldSourceDtoAttribute_Attribute() {
+		return (EReference)statemachineActionFieldSourceDtoAttributeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldSourceEvent() {
+		return statemachineActionFieldSourceEventEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionConditionalTransition() {
+		return statemachineActionConditionalTransitionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionConditionalTransition_Transition() {
+		return (EReference)statemachineActionConditionalTransitionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionConditionalTransition_Guard() {
+		return (EReference)statemachineActionConditionalTransitionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionConditionalTransition_Actions() {
+		return (EReference)statemachineActionConditionalTransitionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineOperationParameter() {
+		return statemachineOperationParameterEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineOperationParameter_Source() {
+		return (EReference)statemachineOperationParameterEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineOperation() {
+		return statemachineOperationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineOperation_Operation() {
+		return (EReference)statemachineOperationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineOperation_First() {
+		return (EReference)statemachineOperationEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineOperation_More() {
+		return (EReference)statemachineOperationEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineGuard() {
+		return statemachineGuardEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineGuard_Guard() {
+		return (EReference)statemachineGuardEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineGuard_HasOnFail() {
+		return (EAttribute)statemachineGuardEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineGuard_OnFailDescription() {
+		return (EAttribute)statemachineGuardEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineGuard_OnFailCaption() {
+		return (EAttribute)statemachineGuardEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineGuard_OnFailType() {
+		return (EAttribute)statemachineGuardEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineFunction() {
+		return statemachineFunctionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineFunction_Function() {
+		return (EReference)statemachineFunctionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineFunction_First() {
+		return (EReference)statemachineFunctionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineFunction_More() {
+		return (EReference)statemachineFunctionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineStorageRetrieve() {
+		return statemachineStorageRetrieveEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineStorageRetrieve_Key() {
+		return (EAttribute)statemachineStorageRetrieveEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineStorageRetrieve_Attribute() {
+		return (EAttribute)statemachineStorageRetrieveEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineStorage() {
+		return statemachineStorageEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineStorage_Key() {
+		return (EAttribute)statemachineStorageEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineStorage_Attribute() {
+		return (EAttribute)statemachineStorageEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineStorage_Content() {
+		return (EReference)statemachineStorageEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldConcatenation() {
+		return statemachineActionFieldConcatenationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldConcatenation_First() {
+		return (EReference)statemachineActionFieldConcatenationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldConcatenation_More() {
+		return (EReference)statemachineActionFieldConcatenationEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldSet() {
+		return statemachineActionFieldSetEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldSet_Attribute() {
+		return (EReference)statemachineActionFieldSetEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldSet_Source() {
+		return (EReference)statemachineActionFieldSetEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldKeystroke() {
+		return statemachineActionFieldKeystrokeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldKeystroke_Attribute() {
+		return (EReference)statemachineActionFieldKeystrokeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionFieldKeystroke_Keystroke() {
+		return (EAttribute)statemachineActionFieldKeystrokeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldClear() {
+		return statemachineActionFieldClearEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldClear_Attribute() {
+		return (EReference)statemachineActionFieldClearEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldGet() {
+		return statemachineActionFieldGetEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldGet_Attribute() {
+		return (EReference)statemachineActionFieldGetEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionFieldRemove() {
+		return statemachineActionFieldRemoveEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionFieldRemove_Attribute() {
+		return (EReference)statemachineActionFieldRemoveEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionItemVisible() {
+		return statemachineActionItemVisibleEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionItemVisible_Attribute() {
+		return (EReference)statemachineActionItemVisibleEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionItemInvisible() {
+		return statemachineActionItemInvisibleEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionItemInvisible_Attribute() {
+		return (EReference)statemachineActionItemInvisibleEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionButtonCaption() {
+		return statemachineActionButtonCaptionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionButtonCaption_Attribute() {
+		return (EReference)statemachineActionButtonCaptionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionButtonCaption_Caption() {
+		return (EReference)statemachineActionButtonCaptionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionButtonImage() {
+		return statemachineActionButtonImageEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionButtonImage_Attribute() {
+		return (EReference)statemachineActionButtonImageEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineActionButtonImage_Image() {
+		return (EAttribute)statemachineActionButtonImageEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionDTOFind() {
+		return statemachineActionDTOFindEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionDTOFind_Dto() {
+		return (EReference)statemachineActionDTOFindEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionDTOFind_Attribute() {
+		return (EReference)statemachineActionDTOFindEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionDTOFind_Search() {
+		return (EReference)statemachineActionDTOFindEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineActionScheduler() {
+		return statemachineActionSchedulerEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineActionScheduler_Scheduler() {
+		return (EReference)statemachineActionSchedulerEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineDTOType() {
+		return statemachineDTOTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachineDTOType_AttributeType() {
+		return (EReference)statemachineDTOTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachineFieldType() {
+		return statemachineFieldTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getStatemachineFieldType_AttributeType() {
+		return (EAttribute)statemachineFieldTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineInternalType() {
+		return statemachineInternalTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineControlButtonEventType() {
+		return statemachineControlButtonEventTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineEvaluationType() {
+		return statemachineEvaluationTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineUserMessageType() {
+		return statemachineUserMessageTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineLineDisplayCursorType() {
+		return statemachineLineDisplayCursorTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineLineDisplayMarqueeType() {
+		return statemachineLineDisplayMarqueeTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineLineDisplayMarqueeFormat() {
+		return statemachineLineDisplayMarqueeFormatEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineLineDisplayTextType() {
+		return statemachineLineDisplayTextTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachineLineDisplayScrollTextType() {
+		return statemachineLineDisplayScrollTextTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getStatemachinePOSPrinterBarcodeType() {
+		return statemachinePOSPrinterBarcodeTypeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EDataType getInternalEObject() {
+		return internalEObjectEDataType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineDSLFactory getStatemachineDSLFactory() {
+		return (StatemachineDSLFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		statemachineModelEClass = createEClass(STATEMACHINE_MODEL);
+		createEReference(statemachineModelEClass, STATEMACHINE_MODEL__PACKAGES);
+
+		statemachineLazyResolverEClass = createEClass(STATEMACHINE_LAZY_RESOLVER);
+		createEOperation(statemachineLazyResolverEClass, STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);
+
+		statemachineBaseEClass = createEClass(STATEMACHINE_BASE);
+		createEAttribute(statemachineBaseEClass, STATEMACHINE_BASE__NAME);
+
+		statemachinePackageEClass = createEClass(STATEMACHINE_PACKAGE);
+		createEReference(statemachinePackageEClass, STATEMACHINE_PACKAGE__STATEMACHINES);
+
+		statemachineEClass = createEClass(STATEMACHINE);
+		createEAttribute(statemachineEClass, STATEMACHINE__DESCRIPTION);
+		createEAttribute(statemachineEClass, STATEMACHINE__DESCRIPTION_VALUE);
+		createEReference(statemachineEClass, STATEMACHINE__FUNCTION_GROUP);
+		createEReference(statemachineEClass, STATEMACHINE__INITIAL_EVENT);
+		createEReference(statemachineEClass, STATEMACHINE__INITIAL_STATE);
+		createEReference(statemachineEClass, STATEMACHINE__EVENTS);
+		createEReference(statemachineEClass, STATEMACHINE__CONTROLS);
+		createEReference(statemachineEClass, STATEMACHINE__STATES);
+
+		statemachineControlEClass = createEClass(STATEMACHINE_CONTROL);
+
+		statemachineControlButtonEClass = createEClass(STATEMACHINE_CONTROL_BUTTON);
+		createEAttribute(statemachineControlButtonEClass, STATEMACHINE_CONTROL_BUTTON__EVENT_TYPE);
+		createEReference(statemachineControlButtonEClass, STATEMACHINE_CONTROL_BUTTON__BUTTONS);
+
+		statemachineControlFieldEClass = createEClass(STATEMACHINE_CONTROL_FIELD);
+		createEReference(statemachineControlFieldEClass, STATEMACHINE_CONTROL_FIELD__FIELDS);
+		createEReference(statemachineControlFieldEClass, STATEMACHINE_CONTROL_FIELD__LAYOUTS);
+
+		statemachineControlDTOEClass = createEClass(STATEMACHINE_CONTROL_DTO);
+		createEReference(statemachineControlDTOEClass, STATEMACHINE_CONTROL_DTO__DTOS);
+
+		statemachineControlSchedulerEClass = createEClass(STATEMACHINE_CONTROL_SCHEDULER);
+		createEReference(statemachineControlSchedulerEClass, STATEMACHINE_CONTROL_SCHEDULER__SCHEDULERS);
+
+		statemachineControlPeripheralEClass = createEClass(STATEMACHINE_CONTROL_PERIPHERAL);
+		createEReference(statemachineControlPeripheralEClass, STATEMACHINE_CONTROL_PERIPHERAL__LINE_DISPLAYS);
+		createEReference(statemachineControlPeripheralEClass, STATEMACHINE_CONTROL_PERIPHERAL__POS_PRINTERS);
+		createEReference(statemachineControlPeripheralEClass, STATEMACHINE_CONTROL_PERIPHERAL__CASH_DRAWERS);
+		createEReference(statemachineControlPeripheralEClass, STATEMACHINE_CONTROL_PERIPHERAL__PAYMENT_TERMINALS);
+
+		statemachineControlButtonAttributeEClass = createEClass(STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE);
+		createEAttribute(statemachineControlButtonAttributeEClass, STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__HAS_IMAGE);
+		createEAttribute(statemachineControlButtonAttributeEClass, STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__IMAGE);
+		createEReference(statemachineControlButtonAttributeEClass, STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE__EVENT);
+
+		statemachineControlButtonAttributeEventEClass = createEClass(STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT);
+
+		statemachineControlButtonAttributeEventKeyboardEClass = createEClass(STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD);
+		createEAttribute(statemachineControlButtonAttributeEventKeyboardEClass, STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE);
+
+		statemachineControlButtonAttributeEventIdentityEClass = createEClass(STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY);
+		createEAttribute(statemachineControlButtonAttributeEventIdentityEClass, STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY);
+
+		statemachineControlButtonAttributeEventEventEClass = createEClass(STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT);
+		createEReference(statemachineControlButtonAttributeEventEventEClass, STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT);
+
+		statemachineControlVisibilityEClass = createEClass(STATEMACHINE_CONTROL_VISIBILITY);
+
+		statemachineControlFieldAttributeEClass = createEClass(STATEMACHINE_CONTROL_FIELD_ATTRIBUTE);
+		createEReference(statemachineControlFieldAttributeEClass, STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE);
+
+		statemachineControlFieldLayoutEClass = createEClass(STATEMACHINE_CONTROL_FIELD_LAYOUT);
+
+		statemachineControlDTOAttributeEClass = createEClass(STATEMACHINE_CONTROL_DTO_ATTRIBUTE);
+		createEReference(statemachineControlDTOAttributeEClass, STATEMACHINE_CONTROL_DTO_ATTRIBUTE__ATTRIBUTE_TYPE);
+		createEAttribute(statemachineControlDTOAttributeEClass, STATEMACHINE_CONTROL_DTO_ATTRIBUTE__HAS_EVENT);
+		createEReference(statemachineControlDTOAttributeEClass, STATEMACHINE_CONTROL_DTO_ATTRIBUTE__EVENT);
+
+		statemachinePeripheralDeviceEClass = createEClass(STATEMACHINE_PERIPHERAL_DEVICE);
+
+		statemachinePeripheralDeviceLineDisplayEClass = createEClass(STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY);
+
+		statemachinePeripheralDevicePOSPrinterEClass = createEClass(STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER);
+
+		statemachinePeripheralDeviceCashDrawerEClass = createEClass(STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER);
+
+		statemachinePeripheralDevicePTEClass = createEClass(STATEMACHINE_PERIPHERAL_DEVICE_PT);
+
+		statemachineControlSchedulerAttributeEClass = createEClass(STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE);
+		createEAttribute(statemachineControlSchedulerAttributeEClass, STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY);
+		createEReference(statemachineControlSchedulerAttributeEClass, STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT);
+
+		statemachineEventEClass = createEClass(STATEMACHINE_EVENT);
+
+		statemachineStateEClass = createEClass(STATEMACHINE_STATE);
+		createEReference(statemachineStateEClass, STATEMACHINE_STATE__TRIGGERS);
+		createEReference(statemachineStateEClass, STATEMACHINE_STATE__IDENTITY);
+		createEReference(statemachineStateEClass, STATEMACHINE_STATE__KEYSTROKE);
+		createEAttribute(statemachineStateEClass, STATEMACHINE_STATE__HAS_KEY_OPERATION);
+		createEReference(statemachineStateEClass, STATEMACHINE_STATE__KEY_OPERATION);
+
+		statemachineTriggerEClass = createEClass(STATEMACHINE_TRIGGER);
+		createEAttribute(statemachineTriggerEClass, STATEMACHINE_TRIGGER__HAS_TRANSITION);
+		createEReference(statemachineTriggerEClass, STATEMACHINE_TRIGGER__TRANSITION);
+		createEReference(statemachineTriggerEClass, STATEMACHINE_TRIGGER__TRIGGERS);
+		createEReference(statemachineTriggerEClass, STATEMACHINE_TRIGGER__GUARDS);
+		createEReference(statemachineTriggerEClass, STATEMACHINE_TRIGGER__ACTIONS);
+
+		statemachineActionEClass = createEClass(STATEMACHINE_ACTION);
+
+		statemachineActionPeripheralBlinkRateEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE);
+		createEReference(statemachineActionPeripheralBlinkRateEClass, STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE);
+		createEAttribute(statemachineActionPeripheralBlinkRateEClass, STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE);
+
+		statemachineActionPeripheralClearEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_CLEAR);
+		createEReference(statemachineActionPeripheralClearEClass, STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE);
+
+		statemachineActionPeripheralCreateWindowEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW);
+		createEReference(statemachineActionPeripheralCreateWindowEClass, STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE);
+		createEAttribute(statemachineActionPeripheralCreateWindowEClass, STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW);
+		createEAttribute(statemachineActionPeripheralCreateWindowEClass, STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN);
+		createEAttribute(statemachineActionPeripheralCreateWindowEClass, STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT);
+		createEAttribute(statemachineActionPeripheralCreateWindowEClass, STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH);
+		createEAttribute(statemachineActionPeripheralCreateWindowEClass, STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT);
+		createEAttribute(statemachineActionPeripheralCreateWindowEClass, STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH);
+
+		statemachineActionPeripheralCursorTypeEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE);
+		createEReference(statemachineActionPeripheralCursorTypeEClass, STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE);
+		createEAttribute(statemachineActionPeripheralCursorTypeEClass, STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE);
+
+		statemachineActionPeripheralDestroyWindowEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW);
+		createEReference(statemachineActionPeripheralDestroyWindowEClass, STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE);
+
+		statemachineActionPeripheralDeviceBrightnessEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS);
+		createEReference(statemachineActionPeripheralDeviceBrightnessEClass, STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE);
+		createEAttribute(statemachineActionPeripheralDeviceBrightnessEClass, STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS);
+
+		statemachineActionPeripheralDisplayBitmapEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP);
+		createEReference(statemachineActionPeripheralDisplayBitmapEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE);
+		createEAttribute(statemachineActionPeripheralDisplayBitmapEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID);
+
+		statemachineActionPeripheralDisplayTextEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT);
+		createEReference(statemachineActionPeripheralDisplayTextEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE);
+		createEReference(statemachineActionPeripheralDisplayTextEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT);
+		createEAttribute(statemachineActionPeripheralDisplayTextEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__HAS_TYPE);
+		createEAttribute(statemachineActionPeripheralDisplayTextEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__TEXT_TYPE);
+
+		statemachineActionPeripheralDisplayTextAtEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT);
+		createEReference(statemachineActionPeripheralDisplayTextAtEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE);
+		createEAttribute(statemachineActionPeripheralDisplayTextAtEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__ROW);
+		createEAttribute(statemachineActionPeripheralDisplayTextAtEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__COLUMN);
+		createEReference(statemachineActionPeripheralDisplayTextAtEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT);
+		createEAttribute(statemachineActionPeripheralDisplayTextAtEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__HAS_TYPE);
+		createEAttribute(statemachineActionPeripheralDisplayTextAtEClass, STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__TEXT_TYPE);
+
+		statemachineActionPeripheralInterCharacterWaitEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT);
+		createEReference(statemachineActionPeripheralInterCharacterWaitEClass, STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE);
+		createEAttribute(statemachineActionPeripheralInterCharacterWaitEClass, STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT);
+
+		statemachineActionPeripheralMarqueeFormatEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT);
+		createEReference(statemachineActionPeripheralMarqueeFormatEClass, STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE);
+		createEAttribute(statemachineActionPeripheralMarqueeFormatEClass, STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT);
+
+		statemachineActionPeripheralMarqueeRepeatWaitEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT);
+		createEReference(statemachineActionPeripheralMarqueeRepeatWaitEClass, STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE);
+		createEAttribute(statemachineActionPeripheralMarqueeRepeatWaitEClass, STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT);
+
+		statemachineActionPeripheralMarqueeTypeEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE);
+		createEReference(statemachineActionPeripheralMarqueeTypeEClass, STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE);
+		createEAttribute(statemachineActionPeripheralMarqueeTypeEClass, STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE);
+
+		statemachineActionPeripheralMarqueeUnitWaitEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT);
+		createEReference(statemachineActionPeripheralMarqueeUnitWaitEClass, STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE);
+		createEAttribute(statemachineActionPeripheralMarqueeUnitWaitEClass, STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT);
+
+		statemachineActionPeripheralScrollEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_SCROLL);
+		createEReference(statemachineActionPeripheralScrollEClass, STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE);
+		createEAttribute(statemachineActionPeripheralScrollEClass, STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION);
+		createEAttribute(statemachineActionPeripheralScrollEClass, STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS);
+
+		statemachineActionPeripheralOpenDrawerEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER);
+		createEReference(statemachineActionPeripheralOpenDrawerEClass, STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE);
+
+		statemachineActionPeripheralPrintBarcodeEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE);
+		createEReference(statemachineActionPeripheralPrintBarcodeEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE);
+		createEAttribute(statemachineActionPeripheralPrintBarcodeEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA);
+		createEAttribute(statemachineActionPeripheralPrintBarcodeEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE);
+
+		statemachineActionPeripheralPrintBitmapEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP);
+		createEReference(statemachineActionPeripheralPrintBitmapEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE);
+		createEAttribute(statemachineActionPeripheralPrintBitmapEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID);
+
+		statemachineActionPeripheralPrintCutEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT);
+		createEReference(statemachineActionPeripheralPrintCutEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE);
+		createEReference(statemachineActionPeripheralPrintCutEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT);
+
+		statemachineActionPeripheralPrintRegisterBitmapEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP);
+		createEReference(statemachineActionPeripheralPrintRegisterBitmapEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE);
+		createEAttribute(statemachineActionPeripheralPrintRegisterBitmapEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID);
+		createEAttribute(statemachineActionPeripheralPrintRegisterBitmapEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME);
+
+		statemachineActionPeripheralPrintNormalEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL);
+		createEReference(statemachineActionPeripheralPrintNormalEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE);
+		createEReference(statemachineActionPeripheralPrintNormalEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__TEXT);
+		createEAttribute(statemachineActionPeripheralPrintNormalEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__BARCODE_TYPE);
+
+		statemachineActionPeripheralPTOpenEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN);
+		createEReference(statemachineActionPeripheralPTOpenEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE);
+		createEReference(statemachineActionPeripheralPTOpenEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST);
+		createEReference(statemachineActionPeripheralPTOpenEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT);
+
+		statemachineActionPeripheralPTCloseEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE);
+		createEReference(statemachineActionPeripheralPTCloseEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE);
+
+		statemachineActionPeripheralPTReversalEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL);
+		createEReference(statemachineActionPeripheralPTReversalEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE);
+		createEReference(statemachineActionPeripheralPTReversalEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD);
+		createEReference(statemachineActionPeripheralPTReversalEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT);
+
+		statemachineActionPeripheralPTAcknowledgeEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE);
+		createEReference(statemachineActionPeripheralPTAcknowledgeEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE);
+
+		statemachineActionPeripheralPTRegistrationEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION);
+		createEReference(statemachineActionPeripheralPTRegistrationEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE);
+		createEReference(statemachineActionPeripheralPTRegistrationEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD);
+		createEAttribute(statemachineActionPeripheralPTRegistrationEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION);
+
+		statemachineActionPeripheralPTAuthorizationEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION);
+		createEReference(statemachineActionPeripheralPTAuthorizationEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE);
+		createEReference(statemachineActionPeripheralPTAuthorizationEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT);
+
+		statemachineActionPeripheralPTResponseEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE);
+		createEReference(statemachineActionPeripheralPTResponseEClass, STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE);
+
+		statemachineActionPeripheralPrintReportEClass = createEClass(STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT);
+		createEReference(statemachineActionPeripheralPrintReportEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__REPORT);
+		createEReference(statemachineActionPeripheralPrintReportEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY);
+		createEAttribute(statemachineActionPeripheralPrintReportEClass, STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__HAS_FILTER);
+
+		statemachineActionFieldSourceEClass = createEClass(STATEMACHINE_ACTION_FIELD_SOURCE);
+
+		statemachineActionFieldSourceStringEClass = createEClass(STATEMACHINE_ACTION_FIELD_SOURCE_STRING);
+		createEAttribute(statemachineActionFieldSourceStringEClass, STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT);
+
+		statemachineActionFieldSourceNumberEClass = createEClass(STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER);
+		createEAttribute(statemachineActionFieldSourceNumberEClass, STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE);
+
+		statemachineActionFieldSourceEvaluateEClass = createEClass(STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE);
+		createEAttribute(statemachineActionFieldSourceEvaluateEClass, STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE);
+
+		statemachineActionFieldSourceTranslateEClass = createEClass(STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE);
+		createEAttribute(statemachineActionFieldSourceTranslateEClass, STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT);
+
+		statemachineActionFieldSourceDtoAttributeEClass = createEClass(STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE);
+		createEReference(statemachineActionFieldSourceDtoAttributeEClass, STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO);
+		createEReference(statemachineActionFieldSourceDtoAttributeEClass, STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE);
+
+		statemachineActionFieldSourceEventEClass = createEClass(STATEMACHINE_ACTION_FIELD_SOURCE_EVENT);
+
+		statemachineActionConditionalTransitionEClass = createEClass(STATEMACHINE_ACTION_CONDITIONAL_TRANSITION);
+		createEReference(statemachineActionConditionalTransitionEClass, STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__TRANSITION);
+		createEReference(statemachineActionConditionalTransitionEClass, STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD);
+		createEReference(statemachineActionConditionalTransitionEClass, STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__ACTIONS);
+
+		statemachineOperationParameterEClass = createEClass(STATEMACHINE_OPERATION_PARAMETER);
+		createEReference(statemachineOperationParameterEClass, STATEMACHINE_OPERATION_PARAMETER__SOURCE);
+
+		statemachineOperationEClass = createEClass(STATEMACHINE_OPERATION);
+		createEReference(statemachineOperationEClass, STATEMACHINE_OPERATION__OPERATION);
+		createEReference(statemachineOperationEClass, STATEMACHINE_OPERATION__FIRST);
+		createEReference(statemachineOperationEClass, STATEMACHINE_OPERATION__MORE);
+
+		statemachineGuardEClass = createEClass(STATEMACHINE_GUARD);
+		createEReference(statemachineGuardEClass, STATEMACHINE_GUARD__GUARD);
+		createEAttribute(statemachineGuardEClass, STATEMACHINE_GUARD__HAS_ON_FAIL);
+		createEAttribute(statemachineGuardEClass, STATEMACHINE_GUARD__ON_FAIL_DESCRIPTION);
+		createEAttribute(statemachineGuardEClass, STATEMACHINE_GUARD__ON_FAIL_CAPTION);
+		createEAttribute(statemachineGuardEClass, STATEMACHINE_GUARD__ON_FAIL_TYPE);
+
+		statemachineFunctionEClass = createEClass(STATEMACHINE_FUNCTION);
+		createEReference(statemachineFunctionEClass, STATEMACHINE_FUNCTION__FUNCTION);
+		createEReference(statemachineFunctionEClass, STATEMACHINE_FUNCTION__FIRST);
+		createEReference(statemachineFunctionEClass, STATEMACHINE_FUNCTION__MORE);
+
+		statemachineStorageRetrieveEClass = createEClass(STATEMACHINE_STORAGE_RETRIEVE);
+		createEAttribute(statemachineStorageRetrieveEClass, STATEMACHINE_STORAGE_RETRIEVE__KEY);
+		createEAttribute(statemachineStorageRetrieveEClass, STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE);
+
+		statemachineStorageEClass = createEClass(STATEMACHINE_STORAGE);
+		createEAttribute(statemachineStorageEClass, STATEMACHINE_STORAGE__KEY);
+		createEAttribute(statemachineStorageEClass, STATEMACHINE_STORAGE__ATTRIBUTE);
+		createEReference(statemachineStorageEClass, STATEMACHINE_STORAGE__CONTENT);
+
+		statemachineActionFieldConcatenationEClass = createEClass(STATEMACHINE_ACTION_FIELD_CONCATENATION);
+		createEReference(statemachineActionFieldConcatenationEClass, STATEMACHINE_ACTION_FIELD_CONCATENATION__FIRST);
+		createEReference(statemachineActionFieldConcatenationEClass, STATEMACHINE_ACTION_FIELD_CONCATENATION__MORE);
+
+		statemachineActionFieldSetEClass = createEClass(STATEMACHINE_ACTION_FIELD_SET);
+		createEReference(statemachineActionFieldSetEClass, STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE);
+		createEReference(statemachineActionFieldSetEClass, STATEMACHINE_ACTION_FIELD_SET__SOURCE);
+
+		statemachineActionFieldKeystrokeEClass = createEClass(STATEMACHINE_ACTION_FIELD_KEYSTROKE);
+		createEReference(statemachineActionFieldKeystrokeEClass, STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE);
+		createEAttribute(statemachineActionFieldKeystrokeEClass, STATEMACHINE_ACTION_FIELD_KEYSTROKE__KEYSTROKE);
+
+		statemachineActionFieldClearEClass = createEClass(STATEMACHINE_ACTION_FIELD_CLEAR);
+		createEReference(statemachineActionFieldClearEClass, STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE);
+
+		statemachineActionFieldGetEClass = createEClass(STATEMACHINE_ACTION_FIELD_GET);
+		createEReference(statemachineActionFieldGetEClass, STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE);
+
+		statemachineActionFieldRemoveEClass = createEClass(STATEMACHINE_ACTION_FIELD_REMOVE);
+		createEReference(statemachineActionFieldRemoveEClass, STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE);
+
+		statemachineActionItemVisibleEClass = createEClass(STATEMACHINE_ACTION_ITEM_VISIBLE);
+		createEReference(statemachineActionItemVisibleEClass, STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE);
+
+		statemachineActionItemInvisibleEClass = createEClass(STATEMACHINE_ACTION_ITEM_INVISIBLE);
+		createEReference(statemachineActionItemInvisibleEClass, STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE);
+
+		statemachineActionButtonCaptionEClass = createEClass(STATEMACHINE_ACTION_BUTTON_CAPTION);
+		createEReference(statemachineActionButtonCaptionEClass, STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE);
+		createEReference(statemachineActionButtonCaptionEClass, STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION);
+
+		statemachineActionButtonImageEClass = createEClass(STATEMACHINE_ACTION_BUTTON_IMAGE);
+		createEReference(statemachineActionButtonImageEClass, STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE);
+		createEAttribute(statemachineActionButtonImageEClass, STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE);
+
+		statemachineActionDTOFindEClass = createEClass(STATEMACHINE_ACTION_DTO_FIND);
+		createEReference(statemachineActionDTOFindEClass, STATEMACHINE_ACTION_DTO_FIND__DTO);
+		createEReference(statemachineActionDTOFindEClass, STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE);
+		createEReference(statemachineActionDTOFindEClass, STATEMACHINE_ACTION_DTO_FIND__SEARCH);
+
+		statemachineActionSchedulerEClass = createEClass(STATEMACHINE_ACTION_SCHEDULER);
+		createEReference(statemachineActionSchedulerEClass, STATEMACHINE_ACTION_SCHEDULER__SCHEDULER);
+
+		statemachineDTOTypeEClass = createEClass(STATEMACHINE_DTO_TYPE);
+		createEReference(statemachineDTOTypeEClass, STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE);
+
+		statemachineFieldTypeEClass = createEClass(STATEMACHINE_FIELD_TYPE);
+		createEAttribute(statemachineFieldTypeEClass, STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE);
+
+		// Create enums
+		statemachineInternalTypeEEnum = createEEnum(STATEMACHINE_INTERNAL_TYPE);
+		statemachineControlButtonEventTypeEEnum = createEEnum(STATEMACHINE_CONTROL_BUTTON_EVENT_TYPE);
+		statemachineEvaluationTypeEEnum = createEEnum(STATEMACHINE_EVALUATION_TYPE);
+		statemachineUserMessageTypeEEnum = createEEnum(STATEMACHINE_USER_MESSAGE_TYPE);
+		statemachineLineDisplayCursorTypeEEnum = createEEnum(STATEMACHINE_LINE_DISPLAY_CURSOR_TYPE);
+		statemachineLineDisplayMarqueeTypeEEnum = createEEnum(STATEMACHINE_LINE_DISPLAY_MARQUEE_TYPE);
+		statemachineLineDisplayMarqueeFormatEEnum = createEEnum(STATEMACHINE_LINE_DISPLAY_MARQUEE_FORMAT);
+		statemachineLineDisplayTextTypeEEnum = createEEnum(STATEMACHINE_LINE_DISPLAY_TEXT_TYPE);
+		statemachineLineDisplayScrollTextTypeEEnum = createEEnum(STATEMACHINE_LINE_DISPLAY_SCROLL_TEXT_TYPE);
+		statemachinePOSPrinterBarcodeTypeEEnum = createEEnum(STATEMACHINE_POS_PRINTER_BARCODE_TYPE);
+
+		// Create data types
+		internalEObjectEDataType = createEDataType(INTERNAL_EOBJECT);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
+		OSBPTypesPackage theOSBPTypesPackage = (OSBPTypesPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPTypesPackage.eNS_URI);
+		FunctionLibraryDSLPackage theFunctionLibraryDSLPackage = (FunctionLibraryDSLPackage)EPackage.Registry.INSTANCE.getEPackage(FunctionLibraryDSLPackage.eNS_URI);
+		ReportDSLPackage theReportDSLPackage = (ReportDSLPackage)EPackage.Registry.INSTANCE.getEPackage(ReportDSLPackage.eNS_URI);
+		OSBPDtoPackage theOSBPDtoPackage = (OSBPDtoPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPDtoPackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		statemachineBaseEClass.getESuperTypes().add(this.getStatemachineLazyResolver());
+		statemachinePackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
+		statemachineEClass.getESuperTypes().add(this.getStatemachineBase());
+		statemachineControlEClass.getESuperTypes().add(this.getStatemachineBase());
+		statemachineControlButtonEClass.getESuperTypes().add(this.getStatemachineControl());
+		statemachineControlButtonEClass.getESuperTypes().add(this.getStatemachineControlVisibility());
+		statemachineControlFieldEClass.getESuperTypes().add(this.getStatemachineControl());
+		statemachineControlDTOEClass.getESuperTypes().add(this.getStatemachineControl());
+		statemachineControlSchedulerEClass.getESuperTypes().add(this.getStatemachineControl());
+		statemachineControlPeripheralEClass.getESuperTypes().add(this.getStatemachineControl());
+		statemachineControlButtonAttributeEClass.getESuperTypes().add(this.getStatemachineControlVisibility());
+		statemachineControlButtonAttributeEventEClass.getESuperTypes().add(this.getStatemachineLazyResolver());
+		statemachineControlButtonAttributeEventKeyboardEClass.getESuperTypes().add(this.getStatemachineControlButtonAttributeEvent());
+		statemachineControlButtonAttributeEventIdentityEClass.getESuperTypes().add(this.getStatemachineControlButtonAttributeEvent());
+		statemachineControlButtonAttributeEventEventEClass.getESuperTypes().add(this.getStatemachineControlButtonAttributeEvent());
+		statemachineControlVisibilityEClass.getESuperTypes().add(this.getStatemachineBase());
+		statemachineControlFieldAttributeEClass.getESuperTypes().add(this.getStatemachineControlVisibility());
+		statemachineControlFieldLayoutEClass.getESuperTypes().add(this.getStatemachineControlVisibility());
+		statemachineControlDTOAttributeEClass.getESuperTypes().add(this.getStatemachineBase());
+		statemachinePeripheralDeviceEClass.getESuperTypes().add(this.getStatemachineBase());
+		statemachinePeripheralDeviceLineDisplayEClass.getESuperTypes().add(this.getStatemachinePeripheralDevice());
+		statemachinePeripheralDevicePOSPrinterEClass.getESuperTypes().add(this.getStatemachinePeripheralDevice());
+		statemachinePeripheralDeviceCashDrawerEClass.getESuperTypes().add(this.getStatemachinePeripheralDevice());
+		statemachinePeripheralDevicePTEClass.getESuperTypes().add(this.getStatemachinePeripheralDevice());
+		statemachineControlSchedulerAttributeEClass.getESuperTypes().add(this.getStatemachineBase());
+		statemachineEventEClass.getESuperTypes().add(this.getStatemachineBase());
+		statemachineStateEClass.getESuperTypes().add(this.getStatemachineBase());
+		statemachineTriggerEClass.getESuperTypes().add(this.getStatemachineLazyResolver());
+		statemachineActionEClass.getESuperTypes().add(this.getStatemachineLazyResolver());
+		statemachineActionPeripheralBlinkRateEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralClearEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralCreateWindowEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralCursorTypeEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralDestroyWindowEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralDeviceBrightnessEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralDisplayBitmapEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralDisplayTextEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralDisplayTextAtEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralInterCharacterWaitEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralMarqueeFormatEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralMarqueeRepeatWaitEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralMarqueeTypeEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralMarqueeUnitWaitEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralScrollEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralOpenDrawerEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPrintBarcodeEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPrintBitmapEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPrintCutEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPrintRegisterBitmapEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPrintNormalEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPTOpenEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPTCloseEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPTReversalEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPTAcknowledgeEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPTRegistrationEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPTAuthorizationEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionPeripheralPTResponseEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionPeripheralPrintReportEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionFieldSourceEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionFieldSourceStringEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionFieldSourceNumberEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionFieldSourceEvaluateEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionFieldSourceTranslateEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionFieldSourceDtoAttributeEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionFieldSourceEventEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionConditionalTransitionEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineOperationParameterEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineOperationEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineGuardEClass.getESuperTypes().add(this.getStatemachineLazyResolver());
+		statemachineFunctionEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineStorageRetrieveEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineStorageEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionFieldConcatenationEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionFieldSetEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionFieldKeystrokeEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionFieldClearEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionFieldGetEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionFieldRemoveEClass.getESuperTypes().add(this.getStatemachineActionFieldSource());
+		statemachineActionItemVisibleEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionItemInvisibleEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionButtonCaptionEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionButtonImageEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionDTOFindEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineActionSchedulerEClass.getESuperTypes().add(this.getStatemachineAction());
+		statemachineDTOTypeEClass.getESuperTypes().add(this.getStatemachineLazyResolver());
+		statemachineFieldTypeEClass.getESuperTypes().add(this.getStatemachineLazyResolver());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(statemachineModelEClass, StatemachineModel.class, "StatemachineModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineModel_Packages(), this.getStatemachinePackage(), null, "packages", null, 0, -1, StatemachineModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineLazyResolverEClass, StatemachineLazyResolver.class, "StatemachineLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		EOperation op = initEOperation(getStatemachineLazyResolver__EResolveProxy__InternalEObject(), theEcorePackage.getEObject(), "eResolveProxy", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, this.getInternalEObject(), "proxy", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEClass(statemachineBaseEClass, StatemachineBase.class, "StatemachineBase", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineBase_Name(), theEcorePackage.getEString(), "name", null, 0, 1, StatemachineBase.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachinePackageEClass, StatemachinePackage.class, "StatemachinePackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachinePackage_Statemachines(), this.getStatemachine(), null, "statemachines", null, 0, -1, StatemachinePackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineEClass, Statemachine.class, "Statemachine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachine_Description(), theEcorePackage.getEBoolean(), "description", null, 0, 1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachine_DescriptionValue(), theEcorePackage.getEString(), "descriptionValue", null, 0, 1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachine_FunctionGroup(), theFunctionLibraryDSLPackage.getFunctionLibraryStatemachineGroup(), null, "functionGroup", null, 0, 1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachine_InitialEvent(), this.getStatemachineEvent(), null, "initialEvent", null, 0, 1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachine_InitialState(), this.getStatemachineState(), null, "initialState", null, 0, 1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachine_Events(), this.getStatemachineEvent(), null, "events", null, 0, -1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachine_Controls(), this.getStatemachineControl(), null, "controls", null, 0, -1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachine_States(), this.getStatemachineState(), null, "states", null, 0, -1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlEClass, StatemachineControl.class, "StatemachineControl", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineControlButtonEClass, StatemachineControlButton.class, "StatemachineControlButton", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineControlButton_EventType(), this.getStatemachineControlButtonEventType(), "eventType", null, 0, 1, StatemachineControlButton.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineControlButton_Buttons(), this.getStatemachineControlButtonAttribute(), null, "buttons", null, 0, -1, StatemachineControlButton.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlFieldEClass, StatemachineControlField.class, "StatemachineControlField", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineControlField_Fields(), this.getStatemachineControlFieldAttribute(), null, "fields", null, 0, -1, StatemachineControlField.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineControlField_Layouts(), this.getStatemachineControlFieldLayout(), null, "layouts", null, 0, -1, StatemachineControlField.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlDTOEClass, StatemachineControlDTO.class, "StatemachineControlDTO", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineControlDTO_Dtos(), this.getStatemachineControlDTOAttribute(), null, "dtos", null, 0, -1, StatemachineControlDTO.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlSchedulerEClass, StatemachineControlScheduler.class, "StatemachineControlScheduler", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineControlScheduler_Schedulers(), this.getStatemachineControlSchedulerAttribute(), null, "schedulers", null, 0, -1, StatemachineControlScheduler.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlPeripheralEClass, StatemachineControlPeripheral.class, "StatemachineControlPeripheral", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineControlPeripheral_LineDisplays(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "lineDisplays", null, 0, -1, StatemachineControlPeripheral.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineControlPeripheral_PosPrinters(), this.getStatemachinePeripheralDevicePOSPrinter(), null, "posPrinters", null, 0, -1, StatemachineControlPeripheral.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineControlPeripheral_CashDrawers(), this.getStatemachinePeripheralDeviceCashDrawer(), null, "cashDrawers", null, 0, -1, StatemachineControlPeripheral.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineControlPeripheral_PaymentTerminals(), this.getStatemachinePeripheralDevicePT(), null, "paymentTerminals", null, 0, -1, StatemachineControlPeripheral.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlButtonAttributeEClass, StatemachineControlButtonAttribute.class, "StatemachineControlButtonAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineControlButtonAttribute_HasImage(), theEcorePackage.getEBoolean(), "hasImage", null, 0, 1, StatemachineControlButtonAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineControlButtonAttribute_Image(), theEcorePackage.getEString(), "image", null, 0, 1, StatemachineControlButtonAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineControlButtonAttribute_Event(), this.getStatemachineControlButtonAttributeEvent(), null, "event", null, 0, 1, StatemachineControlButtonAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlButtonAttributeEventEClass, StatemachineControlButtonAttributeEvent.class, "StatemachineControlButtonAttributeEvent", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineControlButtonAttributeEventKeyboardEClass, StatemachineControlButtonAttributeEventKeyboard.class, "StatemachineControlButtonAttributeEventKeyboard", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineControlButtonAttributeEventKeyboard_Keystroke(), theEcorePackage.getEString(), "keystroke", null, 0, 1, StatemachineControlButtonAttributeEventKeyboard.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlButtonAttributeEventIdentityEClass, StatemachineControlButtonAttributeEventIdentity.class, "StatemachineControlButtonAttributeEventIdentity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineControlButtonAttributeEventIdentity_Identity(), theEcorePackage.getEInt(), "identity", null, 0, 1, StatemachineControlButtonAttributeEventIdentity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlButtonAttributeEventEventEClass, StatemachineControlButtonAttributeEventEvent.class, "StatemachineControlButtonAttributeEventEvent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineControlButtonAttributeEventEvent_Event(), this.getStatemachineEvent(), null, "event", null, 0, 1, StatemachineControlButtonAttributeEventEvent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlVisibilityEClass, StatemachineControlVisibility.class, "StatemachineControlVisibility", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineControlFieldAttributeEClass, StatemachineControlFieldAttribute.class, "StatemachineControlFieldAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineControlFieldAttribute_AttributeType(), this.getStatemachineFieldType(), null, "attributeType", null, 0, 1, StatemachineControlFieldAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineControlFieldLayoutEClass, StatemachineControlFieldLayout.class, "StatemachineControlFieldLayout", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineControlDTOAttributeEClass, StatemachineControlDTOAttribute.class, "StatemachineControlDTOAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineControlDTOAttribute_AttributeType(), this.getStatemachineDTOType(), null, "attributeType", null, 0, 1, StatemachineControlDTOAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineControlDTOAttribute_HasEvent(), theEcorePackage.getEBoolean(), "hasEvent", null, 0, 1, StatemachineControlDTOAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineControlDTOAttribute_Event(), this.getStatemachineEvent(), null, "event", null, 0, 1, StatemachineControlDTOAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachinePeripheralDeviceEClass, StatemachinePeripheralDevice.class, "StatemachinePeripheralDevice", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachinePeripheralDeviceLineDisplayEClass, StatemachinePeripheralDeviceLineDisplay.class, "StatemachinePeripheralDeviceLineDisplay", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachinePeripheralDevicePOSPrinterEClass, StatemachinePeripheralDevicePOSPrinter.class, "StatemachinePeripheralDevicePOSPrinter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachinePeripheralDeviceCashDrawerEClass, StatemachinePeripheralDeviceCashDrawer.class, "StatemachinePeripheralDeviceCashDrawer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachinePeripheralDevicePTEClass, StatemachinePeripheralDevicePT.class, "StatemachinePeripheralDevicePT", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineControlSchedulerAttributeEClass, StatemachineControlSchedulerAttribute.class, "StatemachineControlSchedulerAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineControlSchedulerAttribute_Delay(), theEcorePackage.getEInt(), "delay", null, 0, 1, StatemachineControlSchedulerAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineControlSchedulerAttribute_Event(), this.getStatemachineEvent(), null, "event", null, 0, 1, StatemachineControlSchedulerAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineEventEClass, StatemachineEvent.class, "StatemachineEvent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineStateEClass, StatemachineState.class, "StatemachineState", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineState_Triggers(), this.getStatemachineTrigger(), null, "triggers", null, 0, -1, StatemachineState.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineState_Identity(), this.getStatemachineOperation(), null, "identity", null, 0, 1, StatemachineState.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineState_Keystroke(), this.getStatemachineControlFieldAttribute(), null, "keystroke", null, 0, 1, StatemachineState.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineState_HasKeyOperation(), theEcorePackage.getEBoolean(), "hasKeyOperation", null, 0, 1, StatemachineState.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineState_KeyOperation(), this.getStatemachineOperation(), null, "keyOperation", null, 0, 1, StatemachineState.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineTriggerEClass, StatemachineTrigger.class, "StatemachineTrigger", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineTrigger_HasTransition(), theEcorePackage.getEBoolean(), "hasTransition", null, 0, 1, StatemachineTrigger.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineTrigger_Transition(), this.getStatemachineState(), null, "transition", null, 0, 1, StatemachineTrigger.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineTrigger_Triggers(), this.getStatemachineEvent(), null, "triggers", null, 0, -1, StatemachineTrigger.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineTrigger_Guards(), this.getStatemachineGuard(), null, "guards", null, 0, -1, StatemachineTrigger.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineTrigger_Actions(), this.getStatemachineAction(), null, "actions", null, 0, -1, StatemachineTrigger.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionEClass, StatemachineAction.class, "StatemachineAction", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineActionPeripheralBlinkRateEClass, StatemachineActionPeripheralBlinkRate.class, "StatemachineActionPeripheralBlinkRate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralBlinkRate_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralBlinkRate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralBlinkRate_BlinkRate(), theEcorePackage.getEInt(), "blinkRate", null, 0, 1, StatemachineActionPeripheralBlinkRate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralClearEClass, StatemachineActionPeripheralClear.class, "StatemachineActionPeripheralClear", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralClear_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralClear.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralCreateWindowEClass, StatemachineActionPeripheralCreateWindow.class, "StatemachineActionPeripheralCreateWindow", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralCreateWindow_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralCreateWindow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralCreateWindow_ViewportRow(), theEcorePackage.getEInt(), "viewportRow", null, 0, 1, StatemachineActionPeripheralCreateWindow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralCreateWindow_ViewportColumn(), theEcorePackage.getEInt(), "viewportColumn", null, 0, 1, StatemachineActionPeripheralCreateWindow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralCreateWindow_ViewportHeight(), theEcorePackage.getEInt(), "viewportHeight", null, 0, 1, StatemachineActionPeripheralCreateWindow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralCreateWindow_ViewportWidth(), theEcorePackage.getEInt(), "viewportWidth", null, 0, 1, StatemachineActionPeripheralCreateWindow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralCreateWindow_WindowHeight(), theEcorePackage.getEInt(), "windowHeight", null, 0, 1, StatemachineActionPeripheralCreateWindow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralCreateWindow_WindowWidth(), theEcorePackage.getEInt(), "windowWidth", null, 0, 1, StatemachineActionPeripheralCreateWindow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralCursorTypeEClass, StatemachineActionPeripheralCursorType.class, "StatemachineActionPeripheralCursorType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralCursorType_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralCursorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralCursorType_CursorType(), this.getStatemachineLineDisplayCursorType(), "cursorType", null, 0, 1, StatemachineActionPeripheralCursorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralDestroyWindowEClass, StatemachineActionPeripheralDestroyWindow.class, "StatemachineActionPeripheralDestroyWindow", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralDestroyWindow_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralDestroyWindow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralDeviceBrightnessEClass, StatemachineActionPeripheralDeviceBrightness.class, "StatemachineActionPeripheralDeviceBrightness", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralDeviceBrightness_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralDeviceBrightness.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralDeviceBrightness_Brightness(), theEcorePackage.getEInt(), "brightness", null, 0, 1, StatemachineActionPeripheralDeviceBrightness.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralDisplayBitmapEClass, StatemachineActionPeripheralDisplayBitmap.class, "StatemachineActionPeripheralDisplayBitmap", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralDisplayBitmap_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralDisplayBitmap.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralDisplayBitmap_BitmapId(), theEcorePackage.getEInt(), "bitmapId", null, 0, 1, StatemachineActionPeripheralDisplayBitmap.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralDisplayTextEClass, StatemachineActionPeripheralDisplayText.class, "StatemachineActionPeripheralDisplayText", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralDisplayText_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralDisplayText.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralDisplayText_Text(), this.getStatemachineActionFieldConcatenation(), null, "text", null, 0, 1, StatemachineActionPeripheralDisplayText.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralDisplayText_HasType(), theEcorePackage.getEBoolean(), "hasType", null, 0, 1, StatemachineActionPeripheralDisplayText.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralDisplayText_TextType(), this.getStatemachineLineDisplayTextType(), "textType", null, 0, 1, StatemachineActionPeripheralDisplayText.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralDisplayTextAtEClass, StatemachineActionPeripheralDisplayTextAt.class, "StatemachineActionPeripheralDisplayTextAt", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralDisplayTextAt_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralDisplayTextAt.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralDisplayTextAt_Row(), theEcorePackage.getEInt(), "row", null, 0, 1, StatemachineActionPeripheralDisplayTextAt.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralDisplayTextAt_Column(), theEcorePackage.getEInt(), "column", null, 0, 1, StatemachineActionPeripheralDisplayTextAt.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralDisplayTextAt_Text(), this.getStatemachineActionFieldConcatenation(), null, "text", null, 0, 1, StatemachineActionPeripheralDisplayTextAt.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralDisplayTextAt_HasType(), theEcorePackage.getEBoolean(), "hasType", null, 0, 1, StatemachineActionPeripheralDisplayTextAt.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralDisplayTextAt_TextType(), this.getStatemachineLineDisplayTextType(), "textType", null, 0, 1, StatemachineActionPeripheralDisplayTextAt.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralInterCharacterWaitEClass, StatemachineActionPeripheralInterCharacterWait.class, "StatemachineActionPeripheralInterCharacterWait", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralInterCharacterWait_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralInterCharacterWait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralInterCharacterWait_Wait(), theEcorePackage.getEInt(), "wait", null, 0, 1, StatemachineActionPeripheralInterCharacterWait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralMarqueeFormatEClass, StatemachineActionPeripheralMarqueeFormat.class, "StatemachineActionPeripheralMarqueeFormat", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralMarqueeFormat_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralMarqueeFormat.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralMarqueeFormat_Format(), this.getStatemachineLineDisplayMarqueeFormat(), "format", null, 0, 1, StatemachineActionPeripheralMarqueeFormat.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralMarqueeRepeatWaitEClass, StatemachineActionPeripheralMarqueeRepeatWait.class, "StatemachineActionPeripheralMarqueeRepeatWait", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralMarqueeRepeatWait_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralMarqueeRepeatWait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralMarqueeRepeatWait_Wait(), theEcorePackage.getEInt(), "wait", null, 0, 1, StatemachineActionPeripheralMarqueeRepeatWait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralMarqueeTypeEClass, StatemachineActionPeripheralMarqueeType.class, "StatemachineActionPeripheralMarqueeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralMarqueeType_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralMarqueeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralMarqueeType_MarqueeType(), this.getStatemachineLineDisplayMarqueeType(), "marqueeType", null, 0, 1, StatemachineActionPeripheralMarqueeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralMarqueeUnitWaitEClass, StatemachineActionPeripheralMarqueeUnitWait.class, "StatemachineActionPeripheralMarqueeUnitWait", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralMarqueeUnitWait_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralMarqueeUnitWait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralMarqueeUnitWait_Wait(), theEcorePackage.getEInt(), "wait", null, 0, 1, StatemachineActionPeripheralMarqueeUnitWait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralScrollEClass, StatemachineActionPeripheralScroll.class, "StatemachineActionPeripheralScroll", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralScroll_Device(), this.getStatemachinePeripheralDeviceLineDisplay(), null, "device", null, 0, 1, StatemachineActionPeripheralScroll.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralScroll_Direction(), this.getStatemachineLineDisplayScrollTextType(), "direction", null, 0, 1, StatemachineActionPeripheralScroll.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralScroll_Units(), theEcorePackage.getEInt(), "units", null, 0, 1, StatemachineActionPeripheralScroll.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralOpenDrawerEClass, StatemachineActionPeripheralOpenDrawer.class, "StatemachineActionPeripheralOpenDrawer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralOpenDrawer_Device(), this.getStatemachinePeripheralDeviceCashDrawer(), null, "device", null, 0, 1, StatemachineActionPeripheralOpenDrawer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPrintBarcodeEClass, StatemachineActionPeripheralPrintBarcode.class, "StatemachineActionPeripheralPrintBarcode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPrintBarcode_Device(), this.getStatemachinePeripheralDevicePOSPrinter(), null, "device", null, 0, 1, StatemachineActionPeripheralPrintBarcode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralPrintBarcode_Data(), theEcorePackage.getEString(), "data", null, 0, 1, StatemachineActionPeripheralPrintBarcode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralPrintBarcode_BarcodeType(), this.getStatemachinePOSPrinterBarcodeType(), "barcodeType", null, 0, 1, StatemachineActionPeripheralPrintBarcode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPrintBitmapEClass, StatemachineActionPeripheralPrintBitmap.class, "StatemachineActionPeripheralPrintBitmap", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPrintBitmap_Device(), this.getStatemachinePeripheralDevicePOSPrinter(), null, "device", null, 0, 1, StatemachineActionPeripheralPrintBitmap.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralPrintBitmap_BitmapId(), theEcorePackage.getEInt(), "bitmapId", null, 0, 1, StatemachineActionPeripheralPrintBitmap.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPrintCutEClass, StatemachineActionPeripheralPrintCut.class, "StatemachineActionPeripheralPrintCut", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPrintCut_Device(), this.getStatemachinePeripheralDevicePOSPrinter(), null, "device", null, 0, 1, StatemachineActionPeripheralPrintCut.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPrintCut_Text(), this.getStatemachineActionFieldConcatenation(), null, "text", null, 0, 1, StatemachineActionPeripheralPrintCut.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPrintRegisterBitmapEClass, StatemachineActionPeripheralPrintRegisterBitmap.class, "StatemachineActionPeripheralPrintRegisterBitmap", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPrintRegisterBitmap_Device(), this.getStatemachinePeripheralDevicePOSPrinter(), null, "device", null, 0, 1, StatemachineActionPeripheralPrintRegisterBitmap.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralPrintRegisterBitmap_BitmapId(), theEcorePackage.getEInt(), "bitmapId", null, 0, 1, StatemachineActionPeripheralPrintRegisterBitmap.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralPrintRegisterBitmap_Name(), theEcorePackage.getEString(), "name", null, 0, 1, StatemachineActionPeripheralPrintRegisterBitmap.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPrintNormalEClass, StatemachineActionPeripheralPrintNormal.class, "StatemachineActionPeripheralPrintNormal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPrintNormal_Device(), this.getStatemachinePeripheralDevicePOSPrinter(), null, "device", null, 0, 1, StatemachineActionPeripheralPrintNormal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPrintNormal_Text(), this.getStatemachineActionFieldConcatenation(), null, "text", null, 0, 1, StatemachineActionPeripheralPrintNormal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralPrintNormal_BarcodeType(), this.getStatemachinePOSPrinterBarcodeType(), "barcodeType", null, 0, 1, StatemachineActionPeripheralPrintNormal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPTOpenEClass, StatemachineActionPeripheralPTOpen.class, "StatemachineActionPeripheralPTOpen", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPTOpen_Device(), this.getStatemachinePeripheralDevicePT(), null, "device", null, 0, 1, StatemachineActionPeripheralPTOpen.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPTOpen_Host(), this.getStatemachineActionFieldConcatenation(), null, "host", null, 0, 1, StatemachineActionPeripheralPTOpen.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPTOpen_Port(), this.getStatemachineActionFieldConcatenation(), null, "port", null, 0, 1, StatemachineActionPeripheralPTOpen.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPTCloseEClass, StatemachineActionPeripheralPTClose.class, "StatemachineActionPeripheralPTClose", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPTClose_Device(), this.getStatemachinePeripheralDevicePT(), null, "device", null, 0, 1, StatemachineActionPeripheralPTClose.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPTReversalEClass, StatemachineActionPeripheralPTReversal.class, "StatemachineActionPeripheralPTReversal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPTReversal_Device(), this.getStatemachinePeripheralDevicePT(), null, "device", null, 0, 1, StatemachineActionPeripheralPTReversal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPTReversal_Password(), this.getStatemachineActionFieldConcatenation(), null, "password", null, 0, 1, StatemachineActionPeripheralPTReversal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPTReversal_Receipt(), this.getStatemachineActionFieldConcatenation(), null, "receipt", null, 0, 1, StatemachineActionPeripheralPTReversal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPTAcknowledgeEClass, StatemachineActionPeripheralPTAcknowledge.class, "StatemachineActionPeripheralPTAcknowledge", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPTAcknowledge_Device(), this.getStatemachinePeripheralDevicePT(), null, "device", null, 0, 1, StatemachineActionPeripheralPTAcknowledge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPTRegistrationEClass, StatemachineActionPeripheralPTRegistration.class, "StatemachineActionPeripheralPTRegistration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPTRegistration_Device(), this.getStatemachinePeripheralDevicePT(), null, "device", null, 0, 1, StatemachineActionPeripheralPTRegistration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPTRegistration_Password(), this.getStatemachineActionFieldConcatenation(), null, "password", null, 0, 1, StatemachineActionPeripheralPTRegistration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralPTRegistration_Configuration(), theEcorePackage.getEString(), "configuration", null, 0, 1, StatemachineActionPeripheralPTRegistration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPTAuthorizationEClass, StatemachineActionPeripheralPTAuthorization.class, "StatemachineActionPeripheralPTAuthorization", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPTAuthorization_Device(), this.getStatemachinePeripheralDevicePT(), null, "device", null, 0, 1, StatemachineActionPeripheralPTAuthorization.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPTAuthorization_Amount(), this.getStatemachineActionFieldConcatenation(), null, "amount", null, 0, 1, StatemachineActionPeripheralPTAuthorization.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPTResponseEClass, StatemachineActionPeripheralPTResponse.class, "StatemachineActionPeripheralPTResponse", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPTResponse_Device(), this.getStatemachinePeripheralDevicePT(), null, "device", null, 0, 1, StatemachineActionPeripheralPTResponse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionPeripheralPrintReportEClass, StatemachineActionPeripheralPrintReport.class, "StatemachineActionPeripheralPrintReport", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionPeripheralPrintReport_Report(), theReportDSLPackage.getReport(), null, "report", null, 0, 1, StatemachineActionPeripheralPrintReport.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionPeripheralPrintReport_Key(), this.getStatemachineStorage(), null, "key", null, 0, 1, StatemachineActionPeripheralPrintReport.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionPeripheralPrintReport_HasFilter(), theEcorePackage.getEBoolean(), "hasFilter", null, 0, 1, StatemachineActionPeripheralPrintReport.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldSourceEClass, StatemachineActionFieldSource.class, "StatemachineActionFieldSource", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineActionFieldSourceStringEClass, StatemachineActionFieldSourceString.class, "StatemachineActionFieldSourceString", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineActionFieldSourceString_Text(), theEcorePackage.getEString(), "text", null, 0, 1, StatemachineActionFieldSourceString.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldSourceNumberEClass, StatemachineActionFieldSourceNumber.class, "StatemachineActionFieldSourceNumber", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineActionFieldSourceNumber_Value(), theEcorePackage.getEDoubleObject(), "value", null, 0, 1, StatemachineActionFieldSourceNumber.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldSourceEvaluateEClass, StatemachineActionFieldSourceEvaluate.class, "StatemachineActionFieldSourceEvaluate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineActionFieldSourceEvaluate_Evaluationtype(), this.getStatemachineEvaluationType(), "evaluationtype", null, 0, 1, StatemachineActionFieldSourceEvaluate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldSourceTranslateEClass, StatemachineActionFieldSourceTranslate.class, "StatemachineActionFieldSourceTranslate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineActionFieldSourceTranslate_Text(), theEcorePackage.getEString(), "text", null, 0, 1, StatemachineActionFieldSourceTranslate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldSourceDtoAttributeEClass, StatemachineActionFieldSourceDtoAttribute.class, "StatemachineActionFieldSourceDtoAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionFieldSourceDtoAttribute_Dto(), this.getStatemachineControlDTOAttribute(), null, "dto", null, 0, 1, StatemachineActionFieldSourceDtoAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionFieldSourceDtoAttribute_Attribute(), theOSBPDtoPackage.getLDtoInheritedAttribute(), null, "attribute", null, 0, 1, StatemachineActionFieldSourceDtoAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldSourceEventEClass, StatemachineActionFieldSourceEvent.class, "StatemachineActionFieldSourceEvent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(statemachineActionConditionalTransitionEClass, StatemachineActionConditionalTransition.class, "StatemachineActionConditionalTransition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionConditionalTransition_Transition(), this.getStatemachineState(), null, "transition", null, 0, 1, StatemachineActionConditionalTransition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionConditionalTransition_Guard(), this.getStatemachineGuard(), null, "guard", null, 0, 1, StatemachineActionConditionalTransition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionConditionalTransition_Actions(), this.getStatemachineAction(), null, "actions", null, 0, -1, StatemachineActionConditionalTransition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineOperationParameterEClass, StatemachineOperationParameter.class, "StatemachineOperationParameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineOperationParameter_Source(), this.getStatemachineActionFieldConcatenation(), null, "source", null, 0, 1, StatemachineOperationParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineOperationEClass, StatemachineOperation.class, "StatemachineOperation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineOperation_Operation(), theFunctionLibraryDSLPackage.getFunctionLibraryOperation(), null, "operation", null, 0, 1, StatemachineOperation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineOperation_First(), this.getStatemachineOperationParameter(), null, "first", null, 0, 1, StatemachineOperation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineOperation_More(), this.getStatemachineOperationParameter(), null, "more", null, 0, -1, StatemachineOperation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineGuardEClass, StatemachineGuard.class, "StatemachineGuard", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineGuard_Guard(), theFunctionLibraryDSLPackage.getFunctionLibraryGuard(), null, "guard", null, 0, 1, StatemachineGuard.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineGuard_HasOnFail(), theEcorePackage.getEBoolean(), "hasOnFail", null, 0, 1, StatemachineGuard.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineGuard_OnFailDescription(), theEcorePackage.getEString(), "onFailDescription", null, 0, 1, StatemachineGuard.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineGuard_OnFailCaption(), theEcorePackage.getEString(), "onFailCaption", null, 0, 1, StatemachineGuard.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineGuard_OnFailType(), this.getStatemachineUserMessageType(), "onFailType", null, 0, 1, StatemachineGuard.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineFunctionEClass, StatemachineFunction.class, "StatemachineFunction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineFunction_Function(), theFunctionLibraryDSLPackage.getFunctionLibraryFunction(), null, "function", null, 0, 1, StatemachineFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineFunction_First(), this.getStatemachineOperationParameter(), null, "first", null, 0, 1, StatemachineFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineFunction_More(), this.getStatemachineOperationParameter(), null, "more", null, 0, -1, StatemachineFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineStorageRetrieveEClass, StatemachineStorageRetrieve.class, "StatemachineStorageRetrieve", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineStorageRetrieve_Key(), theEcorePackage.getEString(), "key", null, 0, 1, StatemachineStorageRetrieve.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineStorageRetrieve_Attribute(), theEcorePackage.getEString(), "attribute", null, 0, 1, StatemachineStorageRetrieve.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineStorageEClass, StatemachineStorage.class, "StatemachineStorage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineStorage_Key(), theEcorePackage.getEString(), "key", null, 0, 1, StatemachineStorage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineStorage_Attribute(), theEcorePackage.getEString(), "attribute", null, 0, 1, StatemachineStorage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineStorage_Content(), this.getStatemachineActionFieldConcatenation(), null, "content", null, 0, 1, StatemachineStorage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldConcatenationEClass, StatemachineActionFieldConcatenation.class, "StatemachineActionFieldConcatenation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionFieldConcatenation_First(), this.getStatemachineActionFieldSource(), null, "first", null, 0, 1, StatemachineActionFieldConcatenation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionFieldConcatenation_More(), this.getStatemachineActionFieldSource(), null, "more", null, 0, -1, StatemachineActionFieldConcatenation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldSetEClass, StatemachineActionFieldSet.class, "StatemachineActionFieldSet", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionFieldSet_Attribute(), this.getStatemachineControlFieldAttribute(), null, "attribute", null, 0, 1, StatemachineActionFieldSet.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionFieldSet_Source(), this.getStatemachineActionFieldConcatenation(), null, "source", null, 0, 1, StatemachineActionFieldSet.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldKeystrokeEClass, StatemachineActionFieldKeystroke.class, "StatemachineActionFieldKeystroke", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionFieldKeystroke_Attribute(), this.getStatemachineControlFieldAttribute(), null, "attribute", null, 0, 1, StatemachineActionFieldKeystroke.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionFieldKeystroke_Keystroke(), theEcorePackage.getEString(), "keystroke", null, 0, 1, StatemachineActionFieldKeystroke.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldClearEClass, StatemachineActionFieldClear.class, "StatemachineActionFieldClear", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionFieldClear_Attribute(), this.getStatemachineControlFieldAttribute(), null, "attribute", null, 0, 1, StatemachineActionFieldClear.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldGetEClass, StatemachineActionFieldGet.class, "StatemachineActionFieldGet", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionFieldGet_Attribute(), this.getStatemachineControlFieldAttribute(), null, "attribute", null, 0, 1, StatemachineActionFieldGet.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionFieldRemoveEClass, StatemachineActionFieldRemove.class, "StatemachineActionFieldRemove", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionFieldRemove_Attribute(), this.getStatemachineControlFieldAttribute(), null, "attribute", null, 0, 1, StatemachineActionFieldRemove.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionItemVisibleEClass, StatemachineActionItemVisible.class, "StatemachineActionItemVisible", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionItemVisible_Attribute(), this.getStatemachineControlVisibility(), null, "attribute", null, 0, 1, StatemachineActionItemVisible.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionItemInvisibleEClass, StatemachineActionItemInvisible.class, "StatemachineActionItemInvisible", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionItemInvisible_Attribute(), this.getStatemachineControlVisibility(), null, "attribute", null, 0, 1, StatemachineActionItemInvisible.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionButtonCaptionEClass, StatemachineActionButtonCaption.class, "StatemachineActionButtonCaption", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionButtonCaption_Attribute(), this.getStatemachineControlButtonAttribute(), null, "attribute", null, 0, 1, StatemachineActionButtonCaption.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionButtonCaption_Caption(), this.getStatemachineActionFieldConcatenation(), null, "caption", null, 0, 1, StatemachineActionButtonCaption.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionButtonImageEClass, StatemachineActionButtonImage.class, "StatemachineActionButtonImage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionButtonImage_Attribute(), this.getStatemachineControlButtonAttribute(), null, "attribute", null, 0, 1, StatemachineActionButtonImage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getStatemachineActionButtonImage_Image(), theEcorePackage.getEString(), "image", null, 0, 1, StatemachineActionButtonImage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionDTOFindEClass, StatemachineActionDTOFind.class, "StatemachineActionDTOFind", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionDTOFind_Dto(), this.getStatemachineControlDTOAttribute(), null, "dto", null, 0, 1, StatemachineActionDTOFind.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionDTOFind_Attribute(), theOSBPDtoPackage.getLDtoInheritedAttribute(), null, "attribute", null, 0, 1, StatemachineActionDTOFind.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getStatemachineActionDTOFind_Search(), this.getStatemachineActionFieldConcatenation(), null, "search", null, 0, 1, StatemachineActionDTOFind.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineActionSchedulerEClass, StatemachineActionScheduler.class, "StatemachineActionScheduler", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineActionScheduler_Scheduler(), this.getStatemachineControlSchedulerAttribute(), null, "scheduler", null, 0, 1, StatemachineActionScheduler.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineDTOTypeEClass, StatemachineDTOType.class, "StatemachineDTOType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachineDTOType_AttributeType(), theOSBPDtoPackage.getLDto(), null, "attributeType", null, 0, 1, StatemachineDTOType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(statemachineFieldTypeEClass, StatemachineFieldType.class, "StatemachineFieldType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getStatemachineFieldType_AttributeType(), this.getStatemachineInternalType(), "attributeType", null, 0, 1, StatemachineFieldType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(statemachineInternalTypeEEnum, StatemachineInternalType.class, "StatemachineInternalType");
+		addEEnumLiteral(statemachineInternalTypeEEnum, StatemachineInternalType.BOOLEAN);
+		addEEnumLiteral(statemachineInternalTypeEEnum, StatemachineInternalType.INTEGER);
+		addEEnumLiteral(statemachineInternalTypeEEnum, StatemachineInternalType.LONG);
+		addEEnumLiteral(statemachineInternalTypeEEnum, StatemachineInternalType.DOUBLE);
+		addEEnumLiteral(statemachineInternalTypeEEnum, StatemachineInternalType.STRING);
+		addEEnumLiteral(statemachineInternalTypeEEnum, StatemachineInternalType.DATE);
+		addEEnumLiteral(statemachineInternalTypeEEnum, StatemachineInternalType.SUGGESTTEXT);
+
+		initEEnum(statemachineControlButtonEventTypeEEnum, StatemachineControlButtonEventType.class, "StatemachineControlButtonEventType");
+		addEEnumLiteral(statemachineControlButtonEventTypeEEnum, StatemachineControlButtonEventType.KEYBOARD);
+		addEEnumLiteral(statemachineControlButtonEventTypeEEnum, StatemachineControlButtonEventType.TRIGGER);
+		addEEnumLiteral(statemachineControlButtonEventTypeEEnum, StatemachineControlButtonEventType.IDENTITY);
+
+		initEEnum(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.class, "StatemachineEvaluationType");
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.IP_ADDRESS);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.NOW);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.USER_AGENT_INFO);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.IS_TOUCH_DEVICE);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.IS_HTTPS);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.BROWSER_LOCALE);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.USER_NAME);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.USER_PASSWORD);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.USER_EMAIL);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.USER_POSITION);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.USER_PRTSERVICE);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.SCREEN_WIDTH);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.SCREEN_HEIGHT);
+		addEEnumLiteral(statemachineEvaluationTypeEEnum, StatemachineEvaluationType.TRIGGER);
+
+		initEEnum(statemachineUserMessageTypeEEnum, StatemachineUserMessageType.class, "StatemachineUserMessageType");
+		addEEnumLiteral(statemachineUserMessageTypeEEnum, StatemachineUserMessageType.HUMANIZED_MESSAGE);
+		addEEnumLiteral(statemachineUserMessageTypeEEnum, StatemachineUserMessageType.WARNING_MESSAGE);
+		addEEnumLiteral(statemachineUserMessageTypeEEnum, StatemachineUserMessageType.ERROR_MESSAGE);
+		addEEnumLiteral(statemachineUserMessageTypeEEnum, StatemachineUserMessageType.TRAY_NOTIFICATION);
+		addEEnumLiteral(statemachineUserMessageTypeEEnum, StatemachineUserMessageType.ASSISTIVE_NOTIFICATION);
+
+		initEEnum(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.class, "StatemachineLineDisplayCursorType");
+		addEEnumLiteral(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.DISP_CT_NONE);
+		addEEnumLiteral(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.DISP_CT_FIXED);
+		addEEnumLiteral(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.DISP_CT_BLOCK);
+		addEEnumLiteral(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.DISP_CT_HALFBLOCK);
+		addEEnumLiteral(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.DISP_CT_UNDERLINE);
+		addEEnumLiteral(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.DISP_CT_REVERSE);
+		addEEnumLiteral(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.DISP_CT_OTHER);
+		addEEnumLiteral(statemachineLineDisplayCursorTypeEEnum, StatemachineLineDisplayCursorType.DISP_CT_BLINK);
+
+		initEEnum(statemachineLineDisplayMarqueeTypeEEnum, StatemachineLineDisplayMarqueeType.class, "StatemachineLineDisplayMarqueeType");
+		addEEnumLiteral(statemachineLineDisplayMarqueeTypeEEnum, StatemachineLineDisplayMarqueeType.DISP_MT_NONE);
+		addEEnumLiteral(statemachineLineDisplayMarqueeTypeEEnum, StatemachineLineDisplayMarqueeType.DISP_MT_UP);
+		addEEnumLiteral(statemachineLineDisplayMarqueeTypeEEnum, StatemachineLineDisplayMarqueeType.DISP_MT_DOWN);
+		addEEnumLiteral(statemachineLineDisplayMarqueeTypeEEnum, StatemachineLineDisplayMarqueeType.DISP_MT_LEFT);
+		addEEnumLiteral(statemachineLineDisplayMarqueeTypeEEnum, StatemachineLineDisplayMarqueeType.DISP_MT_RIGHT);
+		addEEnumLiteral(statemachineLineDisplayMarqueeTypeEEnum, StatemachineLineDisplayMarqueeType.DISP_MT_INIT);
+
+		initEEnum(statemachineLineDisplayMarqueeFormatEEnum, StatemachineLineDisplayMarqueeFormat.class, "StatemachineLineDisplayMarqueeFormat");
+		addEEnumLiteral(statemachineLineDisplayMarqueeFormatEEnum, StatemachineLineDisplayMarqueeFormat.DISP_MF_WALK);
+		addEEnumLiteral(statemachineLineDisplayMarqueeFormatEEnum, StatemachineLineDisplayMarqueeFormat.DISP_MF_PLACE);
+
+		initEEnum(statemachineLineDisplayTextTypeEEnum, StatemachineLineDisplayTextType.class, "StatemachineLineDisplayTextType");
+		addEEnumLiteral(statemachineLineDisplayTextTypeEEnum, StatemachineLineDisplayTextType.DISP_DT_NORMAL);
+		addEEnumLiteral(statemachineLineDisplayTextTypeEEnum, StatemachineLineDisplayTextType.DISP_DT_BLINK);
+		addEEnumLiteral(statemachineLineDisplayTextTypeEEnum, StatemachineLineDisplayTextType.DISP_DT_REVERSE);
+		addEEnumLiteral(statemachineLineDisplayTextTypeEEnum, StatemachineLineDisplayTextType.DISP_DT_BLINK_REVERSE);
+
+		initEEnum(statemachineLineDisplayScrollTextTypeEEnum, StatemachineLineDisplayScrollTextType.class, "StatemachineLineDisplayScrollTextType");
+		addEEnumLiteral(statemachineLineDisplayScrollTextTypeEEnum, StatemachineLineDisplayScrollTextType.DISP_ST_UP);
+		addEEnumLiteral(statemachineLineDisplayScrollTextTypeEEnum, StatemachineLineDisplayScrollTextType.DISP_ST_DOWN);
+		addEEnumLiteral(statemachineLineDisplayScrollTextTypeEEnum, StatemachineLineDisplayScrollTextType.DISP_ST_LEFT);
+		addEEnumLiteral(statemachineLineDisplayScrollTextTypeEEnum, StatemachineLineDisplayScrollTextType.DISP_ST_RIGHT);
+
+		initEEnum(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.class, "StatemachinePOSPrinterBarcodeType");
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCA);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCE);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_JAN8);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_EAN8);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_JAN13);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_EAN13);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_TF);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_ITF);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_CODABAR);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_CODE39);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_CODE93);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_CODE128);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCA_S);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCE_S);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCD1);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCD2);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCD3);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCD4);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPCD5);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_EAN8_S);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_EAN13_S);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_EAN128);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_OCRA);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_OCRB);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_CODE128_PARSED);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_GS1DATABAR);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_GS1DATABAR_E);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_GS1DATABAR_S);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_GS1DATABAR_ES);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_PDF417);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_MAXICODE);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_DATAMATRIX);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_QRCODE);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UQRCODE);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_AZTEC);
+		addEEnumLiteral(statemachinePOSPrinterBarcodeTypeEEnum, StatemachinePOSPrinterBarcodeType.PTR_BCS_UPDF417);
+
+		// Initialize data types
+		initEDataType(internalEObjectEDataType, InternalEObject.class, "InternalEObject", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
+
+		// Create resource
+		createResource(eNS_URI);
+
+		// Create annotations
+		// http://www.eclipse.org/emf/2002/Ecore
+		createEcoreAnnotations();
+	}
+
+	/**
+	 * Initializes the annotations for <b>http://www.eclipse.org/emf/2002/Ecore</b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void createEcoreAnnotations() {
+		String source = "http://www.eclipse.org/emf/2002/Ecore";	
+		addAnnotation
+		  (this, 
+		   source, 
+		   new String[] {
+			 "rootPackage", "statemachinedsl"
+		   });
+	}
+
+} //StatemachineDSLPackageImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDTOTypeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDTOTypeImpl.java
new file mode 100644
index 0000000..e732815
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineDTOTypeImpl.java
@@ -0,0 +1,168 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.dsl.semantic.dto.LDto;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDTOType;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine DTO Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineDTOTypeImpl#getAttributeType <em>Attribute Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineDTOTypeImpl extends StatemachineLazyResolverImpl implements StatemachineDTOType {
+	/**
+	 * The cached value of the '{@link #getAttributeType() <em>Attribute Type</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttributeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected LDto attributeType;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineDTOTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_DTO_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LDto getAttributeType() {
+		if (attributeType != null && attributeType.eIsProxy()) {
+			InternalEObject oldAttributeType = (InternalEObject)attributeType;
+			attributeType = (LDto)eResolveProxy(oldAttributeType);
+			if (attributeType != oldAttributeType) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE, oldAttributeType, attributeType));
+			}
+		}
+		return attributeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LDto basicGetAttributeType() {
+		return attributeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttributeType(LDto newAttributeType) {
+		LDto oldAttributeType = attributeType;
+		attributeType = newAttributeType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE, oldAttributeType, attributeType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE:
+				if (resolve) return getAttributeType();
+				return basicGetAttributeType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE:
+				setAttributeType((LDto)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE:
+				setAttributeType((LDto)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE:
+				return attributeType != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineDTOTypeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineEventImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineEventImpl.java
new file mode 100644
index 0000000..1fc0636
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineEventImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Event</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineEventImpl extends StatemachineBaseImpl implements StatemachineEvent {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineEventImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_EVENT;
+	}
+
+} //StatemachineEventImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineFieldTypeImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineFieldTypeImpl.java
new file mode 100644
index 0000000..2c909d7
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineFieldTypeImpl.java
@@ -0,0 +1,174 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFieldType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineInternalType;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Field Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineFieldTypeImpl#getAttributeType <em>Attribute Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineFieldTypeImpl extends StatemachineLazyResolverImpl implements StatemachineFieldType {
+	/**
+	 * The default value of the '{@link #getAttributeType() <em>Attribute Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttributeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineInternalType ATTRIBUTE_TYPE_EDEFAULT = StatemachineInternalType.BOOLEAN;
+
+	/**
+	 * The cached value of the '{@link #getAttributeType() <em>Attribute Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttributeType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineInternalType attributeType = ATTRIBUTE_TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineFieldTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_FIELD_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineInternalType getAttributeType() {
+		return attributeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttributeType(StatemachineInternalType newAttributeType) {
+		StatemachineInternalType oldAttributeType = attributeType;
+		attributeType = newAttributeType == null ? ATTRIBUTE_TYPE_EDEFAULT : newAttributeType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE, oldAttributeType, attributeType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE:
+				return getAttributeType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE:
+				setAttributeType((StatemachineInternalType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE:
+				setAttributeType(ATTRIBUTE_TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE:
+				return attributeType != ATTRIBUTE_TYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (attributeType: ");
+		result.append(attributeType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineFieldTypeImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineFunctionImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineFunctionImpl.java
new file mode 100644
index 0000000..1e33a37
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineFunctionImpl.java
@@ -0,0 +1,292 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryFunction;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFunction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Function</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineFunctionImpl#getFunction <em>Function</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineFunctionImpl#getFirst <em>First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineFunctionImpl#getMore <em>More</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineFunctionImpl extends StatemachineLazyResolverImpl implements StatemachineFunction {
+	/**
+	 * The cached value of the '{@link #getFunction() <em>Function</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFunction()
+	 * @generated
+	 * @ordered
+	 */
+	protected FunctionLibraryFunction function;
+
+	/**
+	 * The cached value of the '{@link #getFirst() <em>First</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFirst()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineOperationParameter first;
+
+	/**
+	 * The cached value of the '{@link #getMore() <em>More</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMore()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineOperationParameter> more;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineFunctionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_FUNCTION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionLibraryFunction getFunction() {
+		if (function != null && function.eIsProxy()) {
+			InternalEObject oldFunction = (InternalEObject)function;
+			function = (FunctionLibraryFunction)eResolveProxy(oldFunction);
+			if (function != oldFunction) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_FUNCTION__FUNCTION, oldFunction, function));
+			}
+		}
+		return function;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionLibraryFunction basicGetFunction() {
+		return function;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFunction(FunctionLibraryFunction newFunction) {
+		FunctionLibraryFunction oldFunction = function;
+		function = newFunction;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_FUNCTION__FUNCTION, oldFunction, function));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineOperationParameter getFirst() {
+		return first;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetFirst(StatemachineOperationParameter newFirst, NotificationChain msgs) {
+		StatemachineOperationParameter oldFirst = first;
+		first = newFirst;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST, oldFirst, newFirst);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFirst(StatemachineOperationParameter newFirst) {
+		if (newFirst != first) {
+			NotificationChain msgs = null;
+			if (first != null)
+				msgs = ((InternalEObject)first).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST, null, msgs);
+			if (newFirst != null)
+				msgs = ((InternalEObject)newFirst).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST, null, msgs);
+			msgs = basicSetFirst(newFirst, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST, newFirst, newFirst));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineOperationParameter> getMore() {
+		if (more == null) {
+			more = new EObjectContainmentEList<StatemachineOperationParameter>(StatemachineOperationParameter.class, this, StatemachineDSLPackage.STATEMACHINE_FUNCTION__MORE);
+		}
+		return more;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST:
+				return basicSetFirst(null, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__MORE:
+				return ((InternalEList<?>)getMore()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FUNCTION:
+				if (resolve) return getFunction();
+				return basicGetFunction();
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST:
+				return getFirst();
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__MORE:
+				return getMore();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FUNCTION:
+				setFunction((FunctionLibraryFunction)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST:
+				setFirst((StatemachineOperationParameter)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__MORE:
+				getMore().clear();
+				getMore().addAll((Collection<? extends StatemachineOperationParameter>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FUNCTION:
+				setFunction((FunctionLibraryFunction)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST:
+				setFirst((StatemachineOperationParameter)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__MORE:
+				getMore().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FUNCTION:
+				return function != null;
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__FIRST:
+				return first != null;
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION__MORE:
+				return more != null && !more.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineFunctionImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineGuardImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineGuardImpl.java
new file mode 100644
index 0000000..aeda155
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineGuardImpl.java
@@ -0,0 +1,399 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryGuard;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineGuard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Guard</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl#getGuard <em>Guard</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl#isHasOnFail <em>Has On Fail</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl#getOnFailDescription <em>On Fail Description</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl#getOnFailCaption <em>On Fail Caption</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineGuardImpl#getOnFailType <em>On Fail Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineGuardImpl extends StatemachineLazyResolverImpl implements StatemachineGuard {
+	/**
+	 * The cached value of the '{@link #getGuard() <em>Guard</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getGuard()
+	 * @generated
+	 * @ordered
+	 */
+	protected FunctionLibraryGuard guard;
+
+	/**
+	 * The default value of the '{@link #isHasOnFail() <em>Has On Fail</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasOnFail()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean HAS_ON_FAIL_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isHasOnFail() <em>Has On Fail</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasOnFail()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean hasOnFail = HAS_ON_FAIL_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getOnFailDescription() <em>On Fail Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOnFailDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String ON_FAIL_DESCRIPTION_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOnFailDescription() <em>On Fail Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOnFailDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected String onFailDescription = ON_FAIL_DESCRIPTION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getOnFailCaption() <em>On Fail Caption</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOnFailCaption()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String ON_FAIL_CAPTION_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOnFailCaption() <em>On Fail Caption</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOnFailCaption()
+	 * @generated
+	 * @ordered
+	 */
+	protected String onFailCaption = ON_FAIL_CAPTION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getOnFailType() <em>On Fail Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOnFailType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final StatemachineUserMessageType ON_FAIL_TYPE_EDEFAULT = StatemachineUserMessageType.HUMANIZED_MESSAGE;
+
+	/**
+	 * The cached value of the '{@link #getOnFailType() <em>On Fail Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOnFailType()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineUserMessageType onFailType = ON_FAIL_TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineGuardImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_GUARD;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionLibraryGuard getGuard() {
+		if (guard != null && guard.eIsProxy()) {
+			InternalEObject oldGuard = (InternalEObject)guard;
+			guard = (FunctionLibraryGuard)eResolveProxy(oldGuard);
+			if (guard != oldGuard) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_GUARD__GUARD, oldGuard, guard));
+			}
+		}
+		return guard;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionLibraryGuard basicGetGuard() {
+		return guard;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setGuard(FunctionLibraryGuard newGuard) {
+		FunctionLibraryGuard oldGuard = guard;
+		guard = newGuard;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_GUARD__GUARD, oldGuard, guard));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isHasOnFail() {
+		return hasOnFail;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHasOnFail(boolean newHasOnFail) {
+		boolean oldHasOnFail = hasOnFail;
+		hasOnFail = newHasOnFail;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_GUARD__HAS_ON_FAIL, oldHasOnFail, hasOnFail));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOnFailDescription() {
+		return onFailDescription;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOnFailDescription(String newOnFailDescription) {
+		String oldOnFailDescription = onFailDescription;
+		onFailDescription = newOnFailDescription;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_DESCRIPTION, oldOnFailDescription, onFailDescription));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOnFailCaption() {
+		return onFailCaption;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOnFailCaption(String newOnFailCaption) {
+		String oldOnFailCaption = onFailCaption;
+		onFailCaption = newOnFailCaption;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_CAPTION, oldOnFailCaption, onFailCaption));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineUserMessageType getOnFailType() {
+		return onFailType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOnFailType(StatemachineUserMessageType newOnFailType) {
+		StatemachineUserMessageType oldOnFailType = onFailType;
+		onFailType = newOnFailType == null ? ON_FAIL_TYPE_EDEFAULT : newOnFailType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_TYPE, oldOnFailType, onFailType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__GUARD:
+				if (resolve) return getGuard();
+				return basicGetGuard();
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__HAS_ON_FAIL:
+				return isHasOnFail();
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_DESCRIPTION:
+				return getOnFailDescription();
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_CAPTION:
+				return getOnFailCaption();
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_TYPE:
+				return getOnFailType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__GUARD:
+				setGuard((FunctionLibraryGuard)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__HAS_ON_FAIL:
+				setHasOnFail((Boolean)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_DESCRIPTION:
+				setOnFailDescription((String)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_CAPTION:
+				setOnFailCaption((String)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_TYPE:
+				setOnFailType((StatemachineUserMessageType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__GUARD:
+				setGuard((FunctionLibraryGuard)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__HAS_ON_FAIL:
+				setHasOnFail(HAS_ON_FAIL_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_DESCRIPTION:
+				setOnFailDescription(ON_FAIL_DESCRIPTION_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_CAPTION:
+				setOnFailCaption(ON_FAIL_CAPTION_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_TYPE:
+				setOnFailType(ON_FAIL_TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__GUARD:
+				return guard != null;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__HAS_ON_FAIL:
+				return hasOnFail != HAS_ON_FAIL_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_DESCRIPTION:
+				return ON_FAIL_DESCRIPTION_EDEFAULT == null ? onFailDescription != null : !ON_FAIL_DESCRIPTION_EDEFAULT.equals(onFailDescription);
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_CAPTION:
+				return ON_FAIL_CAPTION_EDEFAULT == null ? onFailCaption != null : !ON_FAIL_CAPTION_EDEFAULT.equals(onFailCaption);
+			case StatemachineDSLPackage.STATEMACHINE_GUARD__ON_FAIL_TYPE:
+				return onFailType != ON_FAIL_TYPE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (hasOnFail: ");
+		result.append(hasOnFail);
+		result.append(", onFailDescription: ");
+		result.append(onFailDescription);
+		result.append(", onFailCaption: ");
+		result.append(onFailCaption);
+		result.append(", onFailType: ");
+		result.append(onFailType);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineGuardImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineImpl.java
new file mode 100644
index 0000000..f8d95c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineImpl.java
@@ -0,0 +1,542 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryStatemachineGroup;
+
+import org.eclipse.osbp.xtext.statemachine.Statemachine;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControl;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineState;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl#isDescription <em>Description</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl#getDescriptionValue <em>Description Value</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl#getFunctionGroup <em>Function Group</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl#getInitialEvent <em>Initial Event</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl#getInitialState <em>Initial State</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl#getEvents <em>Events</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl#getControls <em>Controls</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineImpl#getStates <em>States</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineImpl extends StatemachineBaseImpl implements Statemachine {
+	/**
+	 * The default value of the '{@link #isDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean DESCRIPTION_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean description = DESCRIPTION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDescriptionValue() <em>Description Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescriptionValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String DESCRIPTION_VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getDescriptionValue() <em>Description Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescriptionValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected String descriptionValue = DESCRIPTION_VALUE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getFunctionGroup() <em>Function Group</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFunctionGroup()
+	 * @generated
+	 * @ordered
+	 */
+	protected FunctionLibraryStatemachineGroup functionGroup;
+
+	/**
+	 * The cached value of the '{@link #getInitialEvent() <em>Initial Event</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInitialEvent()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineEvent initialEvent;
+
+	/**
+	 * The cached value of the '{@link #getInitialState() <em>Initial State</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInitialState()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineState initialState;
+
+	/**
+	 * The cached value of the '{@link #getEvents() <em>Events</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEvents()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineEvent> events;
+
+	/**
+	 * The cached value of the '{@link #getControls() <em>Controls</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getControls()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineControl> controls;
+
+	/**
+	 * The cached value of the '{@link #getStates() <em>States</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStates()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineState> states;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isDescription() {
+		return description;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDescription(boolean newDescription) {
+		boolean oldDescription = description;
+		description = newDescription;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE__DESCRIPTION, oldDescription, description));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getDescriptionValue() {
+		return descriptionValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDescriptionValue(String newDescriptionValue) {
+		String oldDescriptionValue = descriptionValue;
+		descriptionValue = newDescriptionValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE__DESCRIPTION_VALUE, oldDescriptionValue, descriptionValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionLibraryStatemachineGroup getFunctionGroup() {
+		if (functionGroup != null && functionGroup.eIsProxy()) {
+			InternalEObject oldFunctionGroup = (InternalEObject)functionGroup;
+			functionGroup = (FunctionLibraryStatemachineGroup)eResolveProxy(oldFunctionGroup);
+			if (functionGroup != oldFunctionGroup) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE__FUNCTION_GROUP, oldFunctionGroup, functionGroup));
+			}
+		}
+		return functionGroup;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionLibraryStatemachineGroup basicGetFunctionGroup() {
+		return functionGroup;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFunctionGroup(FunctionLibraryStatemachineGroup newFunctionGroup) {
+		FunctionLibraryStatemachineGroup oldFunctionGroup = functionGroup;
+		functionGroup = newFunctionGroup;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE__FUNCTION_GROUP, oldFunctionGroup, functionGroup));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent getInitialEvent() {
+		if (initialEvent != null && initialEvent.eIsProxy()) {
+			InternalEObject oldInitialEvent = (InternalEObject)initialEvent;
+			initialEvent = (StatemachineEvent)eResolveProxy(oldInitialEvent);
+			if (initialEvent != oldInitialEvent) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE__INITIAL_EVENT, oldInitialEvent, initialEvent));
+			}
+		}
+		return initialEvent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineEvent basicGetInitialEvent() {
+		return initialEvent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInitialEvent(StatemachineEvent newInitialEvent) {
+		StatemachineEvent oldInitialEvent = initialEvent;
+		initialEvent = newInitialEvent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE__INITIAL_EVENT, oldInitialEvent, initialEvent));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineState getInitialState() {
+		if (initialState != null && initialState.eIsProxy()) {
+			InternalEObject oldInitialState = (InternalEObject)initialState;
+			initialState = (StatemachineState)eResolveProxy(oldInitialState);
+			if (initialState != oldInitialState) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE__INITIAL_STATE, oldInitialState, initialState));
+			}
+		}
+		return initialState;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineState basicGetInitialState() {
+		return initialState;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInitialState(StatemachineState newInitialState) {
+		StatemachineState oldInitialState = initialState;
+		initialState = newInitialState;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE__INITIAL_STATE, oldInitialState, initialState));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineEvent> getEvents() {
+		if (events == null) {
+			events = new EObjectContainmentEList<StatemachineEvent>(StatemachineEvent.class, this, StatemachineDSLPackage.STATEMACHINE__EVENTS);
+		}
+		return events;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineControl> getControls() {
+		if (controls == null) {
+			controls = new EObjectContainmentEList<StatemachineControl>(StatemachineControl.class, this, StatemachineDSLPackage.STATEMACHINE__CONTROLS);
+		}
+		return controls;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineState> getStates() {
+		if (states == null) {
+			states = new EObjectContainmentEList<StatemachineState>(StatemachineState.class, this, StatemachineDSLPackage.STATEMACHINE__STATES);
+		}
+		return states;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE__EVENTS:
+				return ((InternalEList<?>)getEvents()).basicRemove(otherEnd, msgs);
+			case StatemachineDSLPackage.STATEMACHINE__CONTROLS:
+				return ((InternalEList<?>)getControls()).basicRemove(otherEnd, msgs);
+			case StatemachineDSLPackage.STATEMACHINE__STATES:
+				return ((InternalEList<?>)getStates()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE__DESCRIPTION:
+				return isDescription();
+			case StatemachineDSLPackage.STATEMACHINE__DESCRIPTION_VALUE:
+				return getDescriptionValue();
+			case StatemachineDSLPackage.STATEMACHINE__FUNCTION_GROUP:
+				if (resolve) return getFunctionGroup();
+				return basicGetFunctionGroup();
+			case StatemachineDSLPackage.STATEMACHINE__INITIAL_EVENT:
+				if (resolve) return getInitialEvent();
+				return basicGetInitialEvent();
+			case StatemachineDSLPackage.STATEMACHINE__INITIAL_STATE:
+				if (resolve) return getInitialState();
+				return basicGetInitialState();
+			case StatemachineDSLPackage.STATEMACHINE__EVENTS:
+				return getEvents();
+			case StatemachineDSLPackage.STATEMACHINE__CONTROLS:
+				return getControls();
+			case StatemachineDSLPackage.STATEMACHINE__STATES:
+				return getStates();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE__DESCRIPTION:
+				setDescription((Boolean)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__DESCRIPTION_VALUE:
+				setDescriptionValue((String)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__FUNCTION_GROUP:
+				setFunctionGroup((FunctionLibraryStatemachineGroup)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__INITIAL_EVENT:
+				setInitialEvent((StatemachineEvent)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__INITIAL_STATE:
+				setInitialState((StatemachineState)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__EVENTS:
+				getEvents().clear();
+				getEvents().addAll((Collection<? extends StatemachineEvent>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__CONTROLS:
+				getControls().clear();
+				getControls().addAll((Collection<? extends StatemachineControl>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__STATES:
+				getStates().clear();
+				getStates().addAll((Collection<? extends StatemachineState>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE__DESCRIPTION:
+				setDescription(DESCRIPTION_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__DESCRIPTION_VALUE:
+				setDescriptionValue(DESCRIPTION_VALUE_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__FUNCTION_GROUP:
+				setFunctionGroup((FunctionLibraryStatemachineGroup)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__INITIAL_EVENT:
+				setInitialEvent((StatemachineEvent)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__INITIAL_STATE:
+				setInitialState((StatemachineState)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__EVENTS:
+				getEvents().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__CONTROLS:
+				getControls().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE__STATES:
+				getStates().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE__DESCRIPTION:
+				return description != DESCRIPTION_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE__DESCRIPTION_VALUE:
+				return DESCRIPTION_VALUE_EDEFAULT == null ? descriptionValue != null : !DESCRIPTION_VALUE_EDEFAULT.equals(descriptionValue);
+			case StatemachineDSLPackage.STATEMACHINE__FUNCTION_GROUP:
+				return functionGroup != null;
+			case StatemachineDSLPackage.STATEMACHINE__INITIAL_EVENT:
+				return initialEvent != null;
+			case StatemachineDSLPackage.STATEMACHINE__INITIAL_STATE:
+				return initialState != null;
+			case StatemachineDSLPackage.STATEMACHINE__EVENTS:
+				return events != null && !events.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE__CONTROLS:
+				return controls != null && !controls.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE__STATES:
+				return states != null && !states.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (description: ");
+		result.append(description);
+		result.append(", descriptionValue: ");
+		result.append(descriptionValue);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineLazyResolverImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineLazyResolverImpl.java
new file mode 100644
index 0000000..4af3401
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineLazyResolverImpl.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.osbp.dsl.xtext.lazyresolver.api.EcoreUtil3;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLazyResolver;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Lazy Resolver</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineLazyResolverImpl extends MinimalEObjectImpl.Container implements StatemachineLazyResolver {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineLazyResolverImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_LAZY_RESOLVER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EObject eResolveProxy(final InternalEObject proxy) {
+		Resource _eResource = this.eResource();
+		ResourceSet _resourceSet = _eResource.getResourceSet();
+		return EcoreUtil3.resolve(proxy, _resourceSet);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case StatemachineDSLPackage.STATEMACHINE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT:
+				return eResolveProxy((InternalEObject)arguments.get(0));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //StatemachineLazyResolverImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineModelImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineModelImpl.java
new file mode 100644
index 0000000..aacc1d4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineModelImpl.java
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineModel;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Model</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineModelImpl#getPackages <em>Packages</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineModelImpl extends MinimalEObjectImpl.Container implements StatemachineModel {
+	/**
+	 * The cached value of the '{@link #getPackages() <em>Packages</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPackages()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachinePackage> packages;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineModelImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_MODEL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachinePackage> getPackages() {
+		if (packages == null) {
+			packages = new EObjectContainmentEList<StatemachinePackage>(StatemachinePackage.class, this, StatemachineDSLPackage.STATEMACHINE_MODEL__PACKAGES);
+		}
+		return packages;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_MODEL__PACKAGES:
+				return ((InternalEList<?>)getPackages()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_MODEL__PACKAGES:
+				return getPackages();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_MODEL__PACKAGES:
+				getPackages().clear();
+				getPackages().addAll((Collection<? extends StatemachinePackage>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_MODEL__PACKAGES:
+				getPackages().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_MODEL__PACKAGES:
+				return packages != null && !packages.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineModelImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineOperationImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineOperationImpl.java
new file mode 100644
index 0000000..6cf2c38
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineOperationImpl.java
@@ -0,0 +1,292 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryOperation;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Operation</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationImpl#getOperation <em>Operation</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationImpl#getFirst <em>First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationImpl#getMore <em>More</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineOperationImpl extends StatemachineLazyResolverImpl implements StatemachineOperation {
+	/**
+	 * The cached value of the '{@link #getOperation() <em>Operation</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperation()
+	 * @generated
+	 * @ordered
+	 */
+	protected FunctionLibraryOperation operation;
+
+	/**
+	 * The cached value of the '{@link #getFirst() <em>First</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFirst()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineOperationParameter first;
+
+	/**
+	 * The cached value of the '{@link #getMore() <em>More</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMore()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineOperationParameter> more;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineOperationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_OPERATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionLibraryOperation getOperation() {
+		if (operation != null && operation.eIsProxy()) {
+			InternalEObject oldOperation = (InternalEObject)operation;
+			operation = (FunctionLibraryOperation)eResolveProxy(oldOperation);
+			if (operation != oldOperation) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_OPERATION__OPERATION, oldOperation, operation));
+			}
+		}
+		return operation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FunctionLibraryOperation basicGetOperation() {
+		return operation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperation(FunctionLibraryOperation newOperation) {
+		FunctionLibraryOperation oldOperation = operation;
+		operation = newOperation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_OPERATION__OPERATION, oldOperation, operation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineOperationParameter getFirst() {
+		return first;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetFirst(StatemachineOperationParameter newFirst, NotificationChain msgs) {
+		StatemachineOperationParameter oldFirst = first;
+		first = newFirst;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST, oldFirst, newFirst);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFirst(StatemachineOperationParameter newFirst) {
+		if (newFirst != first) {
+			NotificationChain msgs = null;
+			if (first != null)
+				msgs = ((InternalEObject)first).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST, null, msgs);
+			if (newFirst != null)
+				msgs = ((InternalEObject)newFirst).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST, null, msgs);
+			msgs = basicSetFirst(newFirst, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST, newFirst, newFirst));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineOperationParameter> getMore() {
+		if (more == null) {
+			more = new EObjectContainmentEList<StatemachineOperationParameter>(StatemachineOperationParameter.class, this, StatemachineDSLPackage.STATEMACHINE_OPERATION__MORE);
+		}
+		return more;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST:
+				return basicSetFirst(null, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__MORE:
+				return ((InternalEList<?>)getMore()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__OPERATION:
+				if (resolve) return getOperation();
+				return basicGetOperation();
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST:
+				return getFirst();
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__MORE:
+				return getMore();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__OPERATION:
+				setOperation((FunctionLibraryOperation)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST:
+				setFirst((StatemachineOperationParameter)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__MORE:
+				getMore().clear();
+				getMore().addAll((Collection<? extends StatemachineOperationParameter>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__OPERATION:
+				setOperation((FunctionLibraryOperation)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST:
+				setFirst((StatemachineOperationParameter)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__MORE:
+				getMore().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__OPERATION:
+				return operation != null;
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__FIRST:
+				return first != null;
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION__MORE:
+				return more != null && !more.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineOperationImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineOperationParameterImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineOperationParameterImpl.java
new file mode 100644
index 0000000..7cf8c0c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineOperationParameterImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Operation Parameter</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineOperationParameterImpl#getSource <em>Source</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineOperationParameterImpl extends StatemachineLazyResolverImpl implements StatemachineOperationParameter {
+	/**
+	 * The cached value of the '{@link #getSource() <em>Source</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSource()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation source;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineOperationParameterImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_OPERATION_PARAMETER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getSource() {
+		return source;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSource(StatemachineActionFieldConcatenation newSource, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldSource = source;
+		source = newSource;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE, oldSource, newSource);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSource(StatemachineActionFieldConcatenation newSource) {
+		if (newSource != source) {
+			NotificationChain msgs = null;
+			if (source != null)
+				msgs = ((InternalEObject)source).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE, null, msgs);
+			if (newSource != null)
+				msgs = ((InternalEObject)newSource).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE, null, msgs);
+			msgs = basicSetSource(newSource, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE, newSource, newSource));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE:
+				return basicSetSource(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE:
+				return getSource();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE:
+				setSource((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE:
+				setSource((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER__SOURCE:
+				return source != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineOperationParameterImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePackageImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePackageImpl.java
new file mode 100644
index 0000000..792c2d9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePackageImpl.java
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.dsl.semantic.common.types.impl.LPackageImpl;
+
+import org.eclipse.osbp.xtext.statemachine.Statemachine;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Package</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachinePackageImpl#getStatemachines <em>Statemachines</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachinePackageImpl extends LPackageImpl implements StatemachinePackage {
+	/**
+	 * The cached value of the '{@link #getStatemachines() <em>Statemachines</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStatemachines()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Statemachine> statemachines;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachinePackageImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_PACKAGE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Statemachine> getStatemachines() {
+		if (statemachines == null) {
+			statemachines = new EObjectContainmentEList<Statemachine>(Statemachine.class, this, StatemachineDSLPackage.STATEMACHINE_PACKAGE__STATEMACHINES);
+		}
+		return statemachines;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_PACKAGE__STATEMACHINES:
+				return ((InternalEList<?>)getStatemachines()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_PACKAGE__STATEMACHINES:
+				return getStatemachines();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_PACKAGE__STATEMACHINES:
+				getStatemachines().clear();
+				getStatemachines().addAll((Collection<? extends Statemachine>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_PACKAGE__STATEMACHINES:
+				getStatemachines().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_PACKAGE__STATEMACHINES:
+				return statemachines != null && !statemachines.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachinePackageImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDeviceCashDrawerImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDeviceCashDrawerImpl.java
new file mode 100644
index 0000000..bf0969c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDeviceCashDrawerImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Peripheral Device Cash Drawer</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachinePeripheralDeviceCashDrawerImpl extends StatemachineBaseImpl implements StatemachinePeripheralDeviceCashDrawer {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachinePeripheralDeviceCashDrawerImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER;
+	}
+
+} //StatemachinePeripheralDeviceCashDrawerImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDeviceLineDisplayImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDeviceLineDisplayImpl.java
new file mode 100644
index 0000000..a950b8d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDeviceLineDisplayImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Peripheral Device Line Display</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachinePeripheralDeviceLineDisplayImpl extends StatemachineBaseImpl implements StatemachinePeripheralDeviceLineDisplay {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachinePeripheralDeviceLineDisplayImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY;
+	}
+
+} //StatemachinePeripheralDeviceLineDisplayImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDevicePOSPrinterImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDevicePOSPrinterImpl.java
new file mode 100644
index 0000000..f155c99
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDevicePOSPrinterImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Peripheral Device POS Printer</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachinePeripheralDevicePOSPrinterImpl extends StatemachineBaseImpl implements StatemachinePeripheralDevicePOSPrinter {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachinePeripheralDevicePOSPrinterImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER;
+	}
+
+} //StatemachinePeripheralDevicePOSPrinterImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDevicePTImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDevicePTImpl.java
new file mode 100644
index 0000000..a095b87
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachinePeripheralDevicePTImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Peripheral Device PT</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachinePeripheralDevicePTImpl extends StatemachineBaseImpl implements StatemachinePeripheralDevicePT {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachinePeripheralDevicePTImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_PERIPHERAL_DEVICE_PT;
+	}
+
+} //StatemachinePeripheralDevicePTImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStateImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStateImpl.java
new file mode 100644
index 0000000..9ad7f6a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStateImpl.java
@@ -0,0 +1,426 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineState;
+import org.eclipse.osbp.xtext.statemachine.StatemachineTrigger;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine State</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl#getTriggers <em>Triggers</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl#getIdentity <em>Identity</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl#getKeystroke <em>Keystroke</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl#isHasKeyOperation <em>Has Key Operation</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStateImpl#getKeyOperation <em>Key Operation</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineStateImpl extends StatemachineBaseImpl implements StatemachineState {
+	/**
+	 * The cached value of the '{@link #getTriggers() <em>Triggers</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTriggers()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineTrigger> triggers;
+
+	/**
+	 * The cached value of the '{@link #getIdentity() <em>Identity</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getIdentity()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineOperation identity;
+
+	/**
+	 * The cached value of the '{@link #getKeystroke() <em>Keystroke</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKeystroke()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineControlFieldAttribute keystroke;
+
+	/**
+	 * The default value of the '{@link #isHasKeyOperation() <em>Has Key Operation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasKeyOperation()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean HAS_KEY_OPERATION_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isHasKeyOperation() <em>Has Key Operation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasKeyOperation()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean hasKeyOperation = HAS_KEY_OPERATION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getKeyOperation() <em>Key Operation</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKeyOperation()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineOperation keyOperation;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineStateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_STATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineTrigger> getTriggers() {
+		if (triggers == null) {
+			triggers = new EObjectContainmentEList<StatemachineTrigger>(StatemachineTrigger.class, this, StatemachineDSLPackage.STATEMACHINE_STATE__TRIGGERS);
+		}
+		return triggers;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineOperation getIdentity() {
+		return identity;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetIdentity(StatemachineOperation newIdentity, NotificationChain msgs) {
+		StatemachineOperation oldIdentity = identity;
+		identity = newIdentity;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY, oldIdentity, newIdentity);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setIdentity(StatemachineOperation newIdentity) {
+		if (newIdentity != identity) {
+			NotificationChain msgs = null;
+			if (identity != null)
+				msgs = ((InternalEObject)identity).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY, null, msgs);
+			if (newIdentity != null)
+				msgs = ((InternalEObject)newIdentity).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY, null, msgs);
+			msgs = basicSetIdentity(newIdentity, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY, newIdentity, newIdentity));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute getKeystroke() {
+		if (keystroke != null && keystroke.eIsProxy()) {
+			InternalEObject oldKeystroke = (InternalEObject)keystroke;
+			keystroke = (StatemachineControlFieldAttribute)eResolveProxy(oldKeystroke);
+			if (keystroke != oldKeystroke) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_STATE__KEYSTROKE, oldKeystroke, keystroke));
+			}
+		}
+		return keystroke;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineControlFieldAttribute basicGetKeystroke() {
+		return keystroke;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKeystroke(StatemachineControlFieldAttribute newKeystroke) {
+		StatemachineControlFieldAttribute oldKeystroke = keystroke;
+		keystroke = newKeystroke;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STATE__KEYSTROKE, oldKeystroke, keystroke));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isHasKeyOperation() {
+		return hasKeyOperation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHasKeyOperation(boolean newHasKeyOperation) {
+		boolean oldHasKeyOperation = hasKeyOperation;
+		hasKeyOperation = newHasKeyOperation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STATE__HAS_KEY_OPERATION, oldHasKeyOperation, hasKeyOperation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineOperation getKeyOperation() {
+		return keyOperation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetKeyOperation(StatemachineOperation newKeyOperation, NotificationChain msgs) {
+		StatemachineOperation oldKeyOperation = keyOperation;
+		keyOperation = newKeyOperation;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION, oldKeyOperation, newKeyOperation);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKeyOperation(StatemachineOperation newKeyOperation) {
+		if (newKeyOperation != keyOperation) {
+			NotificationChain msgs = null;
+			if (keyOperation != null)
+				msgs = ((InternalEObject)keyOperation).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION, null, msgs);
+			if (newKeyOperation != null)
+				msgs = ((InternalEObject)newKeyOperation).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION, null, msgs);
+			msgs = basicSetKeyOperation(newKeyOperation, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION, newKeyOperation, newKeyOperation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STATE__TRIGGERS:
+				return ((InternalEList<?>)getTriggers()).basicRemove(otherEnd, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY:
+				return basicSetIdentity(null, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION:
+				return basicSetKeyOperation(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STATE__TRIGGERS:
+				return getTriggers();
+			case StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY:
+				return getIdentity();
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEYSTROKE:
+				if (resolve) return getKeystroke();
+				return basicGetKeystroke();
+			case StatemachineDSLPackage.STATEMACHINE_STATE__HAS_KEY_OPERATION:
+				return isHasKeyOperation();
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION:
+				return getKeyOperation();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STATE__TRIGGERS:
+				getTriggers().clear();
+				getTriggers().addAll((Collection<? extends StatemachineTrigger>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY:
+				setIdentity((StatemachineOperation)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEYSTROKE:
+				setKeystroke((StatemachineControlFieldAttribute)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__HAS_KEY_OPERATION:
+				setHasKeyOperation((Boolean)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION:
+				setKeyOperation((StatemachineOperation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STATE__TRIGGERS:
+				getTriggers().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY:
+				setIdentity((StatemachineOperation)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEYSTROKE:
+				setKeystroke((StatemachineControlFieldAttribute)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__HAS_KEY_OPERATION:
+				setHasKeyOperation(HAS_KEY_OPERATION_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION:
+				setKeyOperation((StatemachineOperation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STATE__TRIGGERS:
+				return triggers != null && !triggers.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE_STATE__IDENTITY:
+				return identity != null;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEYSTROKE:
+				return keystroke != null;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__HAS_KEY_OPERATION:
+				return hasKeyOperation != HAS_KEY_OPERATION_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_STATE__KEY_OPERATION:
+				return keyOperation != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (hasKeyOperation: ");
+		result.append(hasKeyOperation);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineStateImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStorageImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStorageImpl.java
new file mode 100644
index 0000000..7e4b5a7
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStorageImpl.java
@@ -0,0 +1,308 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Storage</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageImpl#getKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageImpl#getAttribute <em>Attribute</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageImpl#getContent <em>Content</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineStorageImpl extends StatemachineLazyResolverImpl implements StatemachineStorage {
+	/**
+	 * The default value of the '{@link #getKey() <em>Key</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKey()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String KEY_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getKey() <em>Key</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKey()
+	 * @generated
+	 * @ordered
+	 */
+	protected String key = KEY_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getAttribute() <em>Attribute</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String ATTRIBUTE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected String attribute = ATTRIBUTE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getContent() <em>Content</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getContent()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineActionFieldConcatenation content;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineStorageImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getKey() {
+		return key;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKey(String newKey) {
+		String oldKey = key;
+		key = newKey;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STORAGE__KEY, oldKey, key));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(String newAttribute) {
+		String oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STORAGE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineActionFieldConcatenation getContent() {
+		return content;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetContent(StatemachineActionFieldConcatenation newContent, NotificationChain msgs) {
+		StatemachineActionFieldConcatenation oldContent = content;
+		content = newContent;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT, oldContent, newContent);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setContent(StatemachineActionFieldConcatenation newContent) {
+		if (newContent != content) {
+			NotificationChain msgs = null;
+			if (content != null)
+				msgs = ((InternalEObject)content).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT, null, msgs);
+			if (newContent != null)
+				msgs = ((InternalEObject)newContent).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT, null, msgs);
+			msgs = basicSetContent(newContent, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT, newContent, newContent));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT:
+				return basicSetContent(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__KEY:
+				return getKey();
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__ATTRIBUTE:
+				return getAttribute();
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT:
+				return getContent();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__KEY:
+				setKey((String)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__ATTRIBUTE:
+				setAttribute((String)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT:
+				setContent((StatemachineActionFieldConcatenation)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__KEY:
+				setKey(KEY_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__ATTRIBUTE:
+				setAttribute(ATTRIBUTE_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT:
+				setContent((StatemachineActionFieldConcatenation)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__KEY:
+				return KEY_EDEFAULT == null ? key != null : !KEY_EDEFAULT.equals(key);
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__ATTRIBUTE:
+				return ATTRIBUTE_EDEFAULT == null ? attribute != null : !ATTRIBUTE_EDEFAULT.equals(attribute);
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE__CONTENT:
+				return content != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (key: ");
+		result.append(key);
+		result.append(", attribute: ");
+		result.append(attribute);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineStorageImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStorageRetrieveImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStorageRetrieveImpl.java
new file mode 100644
index 0000000..cfa35cf
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineStorageRetrieveImpl.java
@@ -0,0 +1,227 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Storage Retrieve</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageRetrieveImpl#getKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineStorageRetrieveImpl#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineStorageRetrieveImpl extends StatemachineLazyResolverImpl implements StatemachineStorageRetrieve {
+	/**
+	 * The default value of the '{@link #getKey() <em>Key</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKey()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String KEY_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getKey() <em>Key</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKey()
+	 * @generated
+	 * @ordered
+	 */
+	protected String key = KEY_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getAttribute() <em>Attribute</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String ATTRIBUTE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected String attribute = ATTRIBUTE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineStorageRetrieveImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getKey() {
+		return key;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKey(String newKey) {
+		String oldKey = key;
+		key = newKey;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__KEY, oldKey, key));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(String newAttribute) {
+		String oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__KEY:
+				return getKey();
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE:
+				return getAttribute();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__KEY:
+				setKey((String)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE:
+				setAttribute((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__KEY:
+				setKey(KEY_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE:
+				setAttribute(ATTRIBUTE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__KEY:
+				return KEY_EDEFAULT == null ? key != null : !KEY_EDEFAULT.equals(key);
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE:
+				return ATTRIBUTE_EDEFAULT == null ? attribute != null : !ATTRIBUTE_EDEFAULT.equals(attribute);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (key: ");
+		result.append(key);
+		result.append(", attribute: ");
+		result.append(attribute);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineStorageRetrieveImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineTriggerImpl.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineTriggerImpl.java
new file mode 100644
index 0000000..909d728
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/impl/StatemachineTriggerImpl.java
@@ -0,0 +1,366 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.osbp.xtext.statemachine.StatemachineAction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineGuard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineState;
+import org.eclipse.osbp.xtext.statemachine.StatemachineTrigger;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine Trigger</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl#isHasTransition <em>Has Transition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl#getTransition <em>Transition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl#getTriggers <em>Triggers</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl#getGuards <em>Guards</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.statemachine.impl.StatemachineTriggerImpl#getActions <em>Actions</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class StatemachineTriggerImpl extends StatemachineLazyResolverImpl implements StatemachineTrigger {
+	/**
+	 * The default value of the '{@link #isHasTransition() <em>Has Transition</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasTransition()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean HAS_TRANSITION_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isHasTransition() <em>Has Transition</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isHasTransition()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean hasTransition = HAS_TRANSITION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getTransition() <em>Transition</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTransition()
+	 * @generated
+	 * @ordered
+	 */
+	protected StatemachineState transition;
+
+	/**
+	 * The cached value of the '{@link #getTriggers() <em>Triggers</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTriggers()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineEvent> triggers;
+
+	/**
+	 * The cached value of the '{@link #getGuards() <em>Guards</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getGuards()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineGuard> guards;
+
+	/**
+	 * The cached value of the '{@link #getActions() <em>Actions</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getActions()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<StatemachineAction> actions;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineTriggerImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachineDSLPackage.Literals.STATEMACHINE_TRIGGER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isHasTransition() {
+		return hasTransition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setHasTransition(boolean newHasTransition) {
+		boolean oldHasTransition = hasTransition;
+		hasTransition = newHasTransition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_TRIGGER__HAS_TRANSITION, oldHasTransition, hasTransition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineState getTransition() {
+		if (transition != null && transition.eIsProxy()) {
+			InternalEObject oldTransition = (InternalEObject)transition;
+			transition = (StatemachineState)eResolveProxy(oldTransition);
+			if (transition != oldTransition) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRANSITION, oldTransition, transition));
+			}
+		}
+		return transition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineState basicGetTransition() {
+		return transition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTransition(StatemachineState newTransition) {
+		StatemachineState oldTransition = transition;
+		transition = newTransition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRANSITION, oldTransition, transition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineEvent> getTriggers() {
+		if (triggers == null) {
+			triggers = new EObjectResolvingEList<StatemachineEvent>(StatemachineEvent.class, this, StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRIGGERS);
+		}
+		return triggers;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineGuard> getGuards() {
+		if (guards == null) {
+			guards = new EObjectContainmentEList<StatemachineGuard>(StatemachineGuard.class, this, StatemachineDSLPackage.STATEMACHINE_TRIGGER__GUARDS);
+		}
+		return guards;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<StatemachineAction> getActions() {
+		if (actions == null) {
+			actions = new EObjectContainmentEList<StatemachineAction>(StatemachineAction.class, this, StatemachineDSLPackage.STATEMACHINE_TRIGGER__ACTIONS);
+		}
+		return actions;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__GUARDS:
+				return ((InternalEList<?>)getGuards()).basicRemove(otherEnd, msgs);
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__ACTIONS:
+				return ((InternalEList<?>)getActions()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__HAS_TRANSITION:
+				return isHasTransition();
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRANSITION:
+				if (resolve) return getTransition();
+				return basicGetTransition();
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRIGGERS:
+				return getTriggers();
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__GUARDS:
+				return getGuards();
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__ACTIONS:
+				return getActions();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__HAS_TRANSITION:
+				setHasTransition((Boolean)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRANSITION:
+				setTransition((StatemachineState)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRIGGERS:
+				getTriggers().clear();
+				getTriggers().addAll((Collection<? extends StatemachineEvent>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__GUARDS:
+				getGuards().clear();
+				getGuards().addAll((Collection<? extends StatemachineGuard>)newValue);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__ACTIONS:
+				getActions().clear();
+				getActions().addAll((Collection<? extends StatemachineAction>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__HAS_TRANSITION:
+				setHasTransition(HAS_TRANSITION_EDEFAULT);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRANSITION:
+				setTransition((StatemachineState)null);
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRIGGERS:
+				getTriggers().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__GUARDS:
+				getGuards().clear();
+				return;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__ACTIONS:
+				getActions().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__HAS_TRANSITION:
+				return hasTransition != HAS_TRANSITION_EDEFAULT;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRANSITION:
+				return transition != null;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__TRIGGERS:
+				return triggers != null && !triggers.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__GUARDS:
+				return guards != null && !guards.isEmpty();
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER__ACTIONS:
+				return actions != null && !actions.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (hasTransition: ");
+		result.append(hasTransition);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StatemachineTriggerImpl
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/util/StatemachineDSLAdapterFactory.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/util/StatemachineDSLAdapterFactory.java
new file mode 100644
index 0000000..2c1963d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/util/StatemachineDSLAdapterFactory.java
@@ -0,0 +1,1718 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.osbp.dsl.semantic.common.types.LLazyResolver;
+import org.eclipse.osbp.dsl.semantic.common.types.LPackage;
+
+import org.eclipse.osbp.xtext.statemachine.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage
+ * @generated
+ */
+public class StatemachineDSLAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static StatemachineDSLPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineDSLAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = StatemachineDSLPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineDSLSwitch<Adapter> modelSwitch =
+		new StatemachineDSLSwitch<Adapter>() {
+			@Override
+			public Adapter caseStatemachineModel(StatemachineModel object) {
+				return createStatemachineModelAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineLazyResolver(StatemachineLazyResolver object) {
+				return createStatemachineLazyResolverAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineBase(StatemachineBase object) {
+				return createStatemachineBaseAdapter();
+			}
+			@Override
+			public Adapter caseStatemachinePackage(StatemachinePackage object) {
+				return createStatemachinePackageAdapter();
+			}
+			@Override
+			public Adapter caseStatemachine(Statemachine object) {
+				return createStatemachineAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControl(StatemachineControl object) {
+				return createStatemachineControlAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlButton(StatemachineControlButton object) {
+				return createStatemachineControlButtonAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlField(StatemachineControlField object) {
+				return createStatemachineControlFieldAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlDTO(StatemachineControlDTO object) {
+				return createStatemachineControlDTOAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlScheduler(StatemachineControlScheduler object) {
+				return createStatemachineControlSchedulerAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlPeripheral(StatemachineControlPeripheral object) {
+				return createStatemachineControlPeripheralAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlButtonAttribute(StatemachineControlButtonAttribute object) {
+				return createStatemachineControlButtonAttributeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlButtonAttributeEvent(StatemachineControlButtonAttributeEvent object) {
+				return createStatemachineControlButtonAttributeEventAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlButtonAttributeEventKeyboard(StatemachineControlButtonAttributeEventKeyboard object) {
+				return createStatemachineControlButtonAttributeEventKeyboardAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlButtonAttributeEventIdentity(StatemachineControlButtonAttributeEventIdentity object) {
+				return createStatemachineControlButtonAttributeEventIdentityAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlButtonAttributeEventEvent(StatemachineControlButtonAttributeEventEvent object) {
+				return createStatemachineControlButtonAttributeEventEventAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlVisibility(StatemachineControlVisibility object) {
+				return createStatemachineControlVisibilityAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlFieldAttribute(StatemachineControlFieldAttribute object) {
+				return createStatemachineControlFieldAttributeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlFieldLayout(StatemachineControlFieldLayout object) {
+				return createStatemachineControlFieldLayoutAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlDTOAttribute(StatemachineControlDTOAttribute object) {
+				return createStatemachineControlDTOAttributeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachinePeripheralDevice(StatemachinePeripheralDevice object) {
+				return createStatemachinePeripheralDeviceAdapter();
+			}
+			@Override
+			public Adapter caseStatemachinePeripheralDeviceLineDisplay(StatemachinePeripheralDeviceLineDisplay object) {
+				return createStatemachinePeripheralDeviceLineDisplayAdapter();
+			}
+			@Override
+			public Adapter caseStatemachinePeripheralDevicePOSPrinter(StatemachinePeripheralDevicePOSPrinter object) {
+				return createStatemachinePeripheralDevicePOSPrinterAdapter();
+			}
+			@Override
+			public Adapter caseStatemachinePeripheralDeviceCashDrawer(StatemachinePeripheralDeviceCashDrawer object) {
+				return createStatemachinePeripheralDeviceCashDrawerAdapter();
+			}
+			@Override
+			public Adapter caseStatemachinePeripheralDevicePT(StatemachinePeripheralDevicePT object) {
+				return createStatemachinePeripheralDevicePTAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineControlSchedulerAttribute(StatemachineControlSchedulerAttribute object) {
+				return createStatemachineControlSchedulerAttributeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineEvent(StatemachineEvent object) {
+				return createStatemachineEventAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineState(StatemachineState object) {
+				return createStatemachineStateAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineTrigger(StatemachineTrigger object) {
+				return createStatemachineTriggerAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineAction(StatemachineAction object) {
+				return createStatemachineActionAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralBlinkRate(StatemachineActionPeripheralBlinkRate object) {
+				return createStatemachineActionPeripheralBlinkRateAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralClear(StatemachineActionPeripheralClear object) {
+				return createStatemachineActionPeripheralClearAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralCreateWindow(StatemachineActionPeripheralCreateWindow object) {
+				return createStatemachineActionPeripheralCreateWindowAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralCursorType(StatemachineActionPeripheralCursorType object) {
+				return createStatemachineActionPeripheralCursorTypeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralDestroyWindow(StatemachineActionPeripheralDestroyWindow object) {
+				return createStatemachineActionPeripheralDestroyWindowAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralDeviceBrightness(StatemachineActionPeripheralDeviceBrightness object) {
+				return createStatemachineActionPeripheralDeviceBrightnessAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralDisplayBitmap(StatemachineActionPeripheralDisplayBitmap object) {
+				return createStatemachineActionPeripheralDisplayBitmapAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralDisplayText(StatemachineActionPeripheralDisplayText object) {
+				return createStatemachineActionPeripheralDisplayTextAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralDisplayTextAt(StatemachineActionPeripheralDisplayTextAt object) {
+				return createStatemachineActionPeripheralDisplayTextAtAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralInterCharacterWait(StatemachineActionPeripheralInterCharacterWait object) {
+				return createStatemachineActionPeripheralInterCharacterWaitAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralMarqueeFormat(StatemachineActionPeripheralMarqueeFormat object) {
+				return createStatemachineActionPeripheralMarqueeFormatAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralMarqueeRepeatWait(StatemachineActionPeripheralMarqueeRepeatWait object) {
+				return createStatemachineActionPeripheralMarqueeRepeatWaitAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralMarqueeType(StatemachineActionPeripheralMarqueeType object) {
+				return createStatemachineActionPeripheralMarqueeTypeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralMarqueeUnitWait(StatemachineActionPeripheralMarqueeUnitWait object) {
+				return createStatemachineActionPeripheralMarqueeUnitWaitAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralScroll(StatemachineActionPeripheralScroll object) {
+				return createStatemachineActionPeripheralScrollAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralOpenDrawer(StatemachineActionPeripheralOpenDrawer object) {
+				return createStatemachineActionPeripheralOpenDrawerAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPrintBarcode(StatemachineActionPeripheralPrintBarcode object) {
+				return createStatemachineActionPeripheralPrintBarcodeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPrintBitmap(StatemachineActionPeripheralPrintBitmap object) {
+				return createStatemachineActionPeripheralPrintBitmapAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPrintCut(StatemachineActionPeripheralPrintCut object) {
+				return createStatemachineActionPeripheralPrintCutAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPrintRegisterBitmap(StatemachineActionPeripheralPrintRegisterBitmap object) {
+				return createStatemachineActionPeripheralPrintRegisterBitmapAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPrintNormal(StatemachineActionPeripheralPrintNormal object) {
+				return createStatemachineActionPeripheralPrintNormalAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPTOpen(StatemachineActionPeripheralPTOpen object) {
+				return createStatemachineActionPeripheralPTOpenAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPTClose(StatemachineActionPeripheralPTClose object) {
+				return createStatemachineActionPeripheralPTCloseAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPTReversal(StatemachineActionPeripheralPTReversal object) {
+				return createStatemachineActionPeripheralPTReversalAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPTAcknowledge(StatemachineActionPeripheralPTAcknowledge object) {
+				return createStatemachineActionPeripheralPTAcknowledgeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPTRegistration(StatemachineActionPeripheralPTRegistration object) {
+				return createStatemachineActionPeripheralPTRegistrationAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPTAuthorization(StatemachineActionPeripheralPTAuthorization object) {
+				return createStatemachineActionPeripheralPTAuthorizationAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPTResponse(StatemachineActionPeripheralPTResponse object) {
+				return createStatemachineActionPeripheralPTResponseAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionPeripheralPrintReport(StatemachineActionPeripheralPrintReport object) {
+				return createStatemachineActionPeripheralPrintReportAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldSource(StatemachineActionFieldSource object) {
+				return createStatemachineActionFieldSourceAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldSourceString(StatemachineActionFieldSourceString object) {
+				return createStatemachineActionFieldSourceStringAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldSourceNumber(StatemachineActionFieldSourceNumber object) {
+				return createStatemachineActionFieldSourceNumberAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldSourceEvaluate(StatemachineActionFieldSourceEvaluate object) {
+				return createStatemachineActionFieldSourceEvaluateAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldSourceTranslate(StatemachineActionFieldSourceTranslate object) {
+				return createStatemachineActionFieldSourceTranslateAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldSourceDtoAttribute(StatemachineActionFieldSourceDtoAttribute object) {
+				return createStatemachineActionFieldSourceDtoAttributeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldSourceEvent(StatemachineActionFieldSourceEvent object) {
+				return createStatemachineActionFieldSourceEventAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionConditionalTransition(StatemachineActionConditionalTransition object) {
+				return createStatemachineActionConditionalTransitionAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineOperationParameter(StatemachineOperationParameter object) {
+				return createStatemachineOperationParameterAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineOperation(StatemachineOperation object) {
+				return createStatemachineOperationAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineGuard(StatemachineGuard object) {
+				return createStatemachineGuardAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineFunction(StatemachineFunction object) {
+				return createStatemachineFunctionAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineStorageRetrieve(StatemachineStorageRetrieve object) {
+				return createStatemachineStorageRetrieveAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineStorage(StatemachineStorage object) {
+				return createStatemachineStorageAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldConcatenation(StatemachineActionFieldConcatenation object) {
+				return createStatemachineActionFieldConcatenationAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldSet(StatemachineActionFieldSet object) {
+				return createStatemachineActionFieldSetAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldKeystroke(StatemachineActionFieldKeystroke object) {
+				return createStatemachineActionFieldKeystrokeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldClear(StatemachineActionFieldClear object) {
+				return createStatemachineActionFieldClearAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldGet(StatemachineActionFieldGet object) {
+				return createStatemachineActionFieldGetAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionFieldRemove(StatemachineActionFieldRemove object) {
+				return createStatemachineActionFieldRemoveAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionItemVisible(StatemachineActionItemVisible object) {
+				return createStatemachineActionItemVisibleAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionItemInvisible(StatemachineActionItemInvisible object) {
+				return createStatemachineActionItemInvisibleAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionButtonCaption(StatemachineActionButtonCaption object) {
+				return createStatemachineActionButtonCaptionAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionButtonImage(StatemachineActionButtonImage object) {
+				return createStatemachineActionButtonImageAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionDTOFind(StatemachineActionDTOFind object) {
+				return createStatemachineActionDTOFindAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineActionScheduler(StatemachineActionScheduler object) {
+				return createStatemachineActionSchedulerAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineDTOType(StatemachineDTOType object) {
+				return createStatemachineDTOTypeAdapter();
+			}
+			@Override
+			public Adapter caseStatemachineFieldType(StatemachineFieldType object) {
+				return createStatemachineFieldTypeAdapter();
+			}
+			@Override
+			public Adapter caseLLazyResolver(LLazyResolver object) {
+				return createLLazyResolverAdapter();
+			}
+			@Override
+			public Adapter caseLPackage(LPackage object) {
+				return createLPackageAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineModel <em>Statemachine Model</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineModel
+	 * @generated
+	 */
+	public Adapter createStatemachineModelAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineLazyResolver <em>Statemachine Lazy Resolver</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineLazyResolver
+	 * @generated
+	 */
+	public Adapter createStatemachineLazyResolverAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineBase <em>Statemachine Base</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineBase
+	 * @generated
+	 */
+	public Adapter createStatemachineBaseAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePackage <em>Statemachine Package</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePackage
+	 * @generated
+	 */
+	public Adapter createStatemachinePackageAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.Statemachine <em>Statemachine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.Statemachine
+	 * @generated
+	 */
+	public Adapter createStatemachineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControl <em>Statemachine Control</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControl
+	 * @generated
+	 */
+	public Adapter createStatemachineControlAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButton <em>Statemachine Control Button</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButton
+	 * @generated
+	 */
+	public Adapter createStatemachineControlButtonAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlField <em>Statemachine Control Field</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlField
+	 * @generated
+	 */
+	public Adapter createStatemachineControlFieldAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO <em>Statemachine Control DTO</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO
+	 * @generated
+	 */
+	public Adapter createStatemachineControlDTOAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler <em>Statemachine Control Scheduler</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler
+	 * @generated
+	 */
+	public Adapter createStatemachineControlSchedulerAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral <em>Statemachine Control Peripheral</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral
+	 * @generated
+	 */
+	public Adapter createStatemachineControlPeripheralAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute <em>Statemachine Control Button Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute
+	 * @generated
+	 */
+	public Adapter createStatemachineControlButtonAttributeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent <em>Statemachine Control Button Attribute Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent
+	 * @generated
+	 */
+	public Adapter createStatemachineControlButtonAttributeEventAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard <em>Statemachine Control Button Attribute Event Keyboard</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard
+	 * @generated
+	 */
+	public Adapter createStatemachineControlButtonAttributeEventKeyboardAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity <em>Statemachine Control Button Attribute Event Identity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity
+	 * @generated
+	 */
+	public Adapter createStatemachineControlButtonAttributeEventIdentityAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent <em>Statemachine Control Button Attribute Event Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent
+	 * @generated
+	 */
+	public Adapter createStatemachineControlButtonAttributeEventEventAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility <em>Statemachine Control Visibility</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility
+	 * @generated
+	 */
+	public Adapter createStatemachineControlVisibilityAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute <em>Statemachine Control Field Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute
+	 * @generated
+	 */
+	public Adapter createStatemachineControlFieldAttributeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout <em>Statemachine Control Field Layout</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout
+	 * @generated
+	 */
+	public Adapter createStatemachineControlFieldLayoutAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute <em>Statemachine Control DTO Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute
+	 * @generated
+	 */
+	public Adapter createStatemachineControlDTOAttributeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice <em>Statemachine Peripheral Device</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevice
+	 * @generated
+	 */
+	public Adapter createStatemachinePeripheralDeviceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay <em>Statemachine Peripheral Device Line Display</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay
+	 * @generated
+	 */
+	public Adapter createStatemachinePeripheralDeviceLineDisplayAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter <em>Statemachine Peripheral Device POS Printer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter
+	 * @generated
+	 */
+	public Adapter createStatemachinePeripheralDevicePOSPrinterAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer <em>Statemachine Peripheral Device Cash Drawer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer
+	 * @generated
+	 */
+	public Adapter createStatemachinePeripheralDeviceCashDrawerAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT <em>Statemachine Peripheral Device PT</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT
+	 * @generated
+	 */
+	public Adapter createStatemachinePeripheralDevicePTAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute <em>Statemachine Control Scheduler Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute
+	 * @generated
+	 */
+	public Adapter createStatemachineControlSchedulerAttributeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineEvent <em>Statemachine Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineEvent
+	 * @generated
+	 */
+	public Adapter createStatemachineEventAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineState <em>Statemachine State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineState
+	 * @generated
+	 */
+	public Adapter createStatemachineStateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineTrigger <em>Statemachine Trigger</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineTrigger
+	 * @generated
+	 */
+	public Adapter createStatemachineTriggerAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineAction <em>Statemachine Action</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineAction
+	 * @generated
+	 */
+	public Adapter createStatemachineActionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate <em>Statemachine Action Peripheral Blink Rate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralBlinkRateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear <em>Statemachine Action Peripheral Clear</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralClearAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow <em>Statemachine Action Peripheral Create Window</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralCreateWindowAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType <em>Statemachine Action Peripheral Cursor Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralCursorTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow <em>Statemachine Action Peripheral Destroy Window</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralDestroyWindowAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness <em>Statemachine Action Peripheral Device Brightness</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralDeviceBrightnessAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap <em>Statemachine Action Peripheral Display Bitmap</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralDisplayBitmapAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText <em>Statemachine Action Peripheral Display Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralDisplayTextAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt <em>Statemachine Action Peripheral Display Text At</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralDisplayTextAtAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait <em>Statemachine Action Peripheral Inter Character Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralInterCharacterWaitAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat <em>Statemachine Action Peripheral Marquee Format</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralMarqueeFormatAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait <em>Statemachine Action Peripheral Marquee Repeat Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralMarqueeRepeatWaitAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType <em>Statemachine Action Peripheral Marquee Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralMarqueeTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait <em>Statemachine Action Peripheral Marquee Unit Wait</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralMarqueeUnitWaitAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll <em>Statemachine Action Peripheral Scroll</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralScrollAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer <em>Statemachine Action Peripheral Open Drawer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralOpenDrawerAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode <em>Statemachine Action Peripheral Print Barcode</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPrintBarcodeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap <em>Statemachine Action Peripheral Print Bitmap</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPrintBitmapAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut <em>Statemachine Action Peripheral Print Cut</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPrintCutAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap <em>Statemachine Action Peripheral Print Register Bitmap</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPrintRegisterBitmapAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal <em>Statemachine Action Peripheral Print Normal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPrintNormalAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen <em>Statemachine Action Peripheral PT Open</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPTOpenAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose <em>Statemachine Action Peripheral PT Close</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPTCloseAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal <em>Statemachine Action Peripheral PT Reversal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPTReversalAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge <em>Statemachine Action Peripheral PT Acknowledge</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPTAcknowledgeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration <em>Statemachine Action Peripheral PT Registration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPTRegistrationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization <em>Statemachine Action Peripheral PT Authorization</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPTAuthorizationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse <em>Statemachine Action Peripheral PT Response</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPTResponseAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport <em>Statemachine Action Peripheral Print Report</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport
+	 * @generated
+	 */
+	public Adapter createStatemachineActionPeripheralPrintReportAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource <em>Statemachine Action Field Source</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldSourceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString <em>Statemachine Action Field Source String</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldSourceStringAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber <em>Statemachine Action Field Source Number</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldSourceNumberAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate <em>Statemachine Action Field Source Evaluate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldSourceEvaluateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate <em>Statemachine Action Field Source Translate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldSourceTranslateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute <em>Statemachine Action Field Source Dto Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldSourceDtoAttributeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent <em>Statemachine Action Field Source Event</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldSourceEventAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition <em>Statemachine Action Conditional Transition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition
+	 * @generated
+	 */
+	public Adapter createStatemachineActionConditionalTransitionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter <em>Statemachine Operation Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter
+	 * @generated
+	 */
+	public Adapter createStatemachineOperationParameterAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineOperation <em>Statemachine Operation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineOperation
+	 * @generated
+	 */
+	public Adapter createStatemachineOperationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineGuard <em>Statemachine Guard</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineGuard
+	 * @generated
+	 */
+	public Adapter createStatemachineGuardAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFunction <em>Statemachine Function</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineFunction
+	 * @generated
+	 */
+	public Adapter createStatemachineFunctionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve <em>Statemachine Storage Retrieve</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve
+	 * @generated
+	 */
+	public Adapter createStatemachineStorageRetrieveAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineStorage <em>Statemachine Storage</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineStorage
+	 * @generated
+	 */
+	public Adapter createStatemachineStorageAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation <em>Statemachine Action Field Concatenation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldConcatenationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet <em>Statemachine Action Field Set</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldSetAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke <em>Statemachine Action Field Keystroke</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldKeystrokeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear <em>Statemachine Action Field Clear</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldClearAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet <em>Statemachine Action Field Get</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldGetAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove <em>Statemachine Action Field Remove</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove
+	 * @generated
+	 */
+	public Adapter createStatemachineActionFieldRemoveAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible <em>Statemachine Action Item Visible</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible
+	 * @generated
+	 */
+	public Adapter createStatemachineActionItemVisibleAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible <em>Statemachine Action Item Invisible</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible
+	 * @generated
+	 */
+	public Adapter createStatemachineActionItemInvisibleAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption <em>Statemachine Action Button Caption</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption
+	 * @generated
+	 */
+	public Adapter createStatemachineActionButtonCaptionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage <em>Statemachine Action Button Image</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage
+	 * @generated
+	 */
+	public Adapter createStatemachineActionButtonImageAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind <em>Statemachine Action DTO Find</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind
+	 * @generated
+	 */
+	public Adapter createStatemachineActionDTOFindAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler <em>Statemachine Action Scheduler</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler
+	 * @generated
+	 */
+	public Adapter createStatemachineActionSchedulerAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineDTOType <em>Statemachine DTO Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDTOType
+	 * @generated
+	 */
+	public Adapter createStatemachineDTOTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.statemachine.StatemachineFieldType <em>Statemachine Field Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.statemachine.StatemachineFieldType
+	 * @generated
+	 */
+	public Adapter createStatemachineFieldTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.dsl.semantic.common.types.LLazyResolver <em>LLazy Resolver</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.dsl.semantic.common.types.LLazyResolver
+	 * @generated
+	 */
+	public Adapter createLLazyResolverAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.dsl.semantic.common.types.LPackage <em>LPackage</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.dsl.semantic.common.types.LPackage
+	 * @generated
+	 */
+	public Adapter createLPackageAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //StatemachineDSLAdapterFactory
diff --git a/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/util/StatemachineDSLSwitch.java b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/util/StatemachineDSLSwitch.java
new file mode 100644
index 0000000..4ed92f7
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/emf-gen/org/eclipse/osbp/xtext/statemachine/util/StatemachineDSLSwitch.java
@@ -0,0 +1,2148 @@
+/**
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.statemachine.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.osbp.dsl.semantic.common.types.LLazyResolver;
+import org.eclipse.osbp.dsl.semantic.common.types.LPackage;
+
+import org.eclipse.osbp.xtext.statemachine.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage
+ * @generated
+ */
+public class StatemachineDSLSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static StatemachineDSLPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineDSLSwitch() {
+		if (modelPackage == null) {
+			modelPackage = StatemachineDSLPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @parameter ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case StatemachineDSLPackage.STATEMACHINE_MODEL: {
+				StatemachineModel statemachineModel = (StatemachineModel)theEObject;
+				T result = caseStatemachineModel(statemachineModel);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_LAZY_RESOLVER: {
+				StatemachineLazyResolver statemachineLazyResolver = (StatemachineLazyResolver)theEObject;
+				T result = caseStatemachineLazyResolver(statemachineLazyResolver);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_BASE: {
+				StatemachineBase statemachineBase = (StatemachineBase)theEObject;
+				T result = caseStatemachineBase(statemachineBase);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineBase);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_PACKAGE: {
+				StatemachinePackage statemachinePackage = (StatemachinePackage)theEObject;
+				T result = caseStatemachinePackage(statemachinePackage);
+				if (result == null) result = caseLPackage(statemachinePackage);
+				if (result == null) result = caseLLazyResolver(statemachinePackage);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE: {
+				Statemachine statemachine = (Statemachine)theEObject;
+				T result = caseStatemachine(statemachine);
+				if (result == null) result = caseStatemachineBase(statemachine);
+				if (result == null) result = caseStatemachineLazyResolver(statemachine);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL: {
+				StatemachineControl statemachineControl = (StatemachineControl)theEObject;
+				T result = caseStatemachineControl(statemachineControl);
+				if (result == null) result = caseStatemachineBase(statemachineControl);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControl);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON: {
+				StatemachineControlButton statemachineControlButton = (StatemachineControlButton)theEObject;
+				T result = caseStatemachineControlButton(statemachineControlButton);
+				if (result == null) result = caseStatemachineControl(statemachineControlButton);
+				if (result == null) result = caseStatemachineControlVisibility(statemachineControlButton);
+				if (result == null) result = caseStatemachineBase(statemachineControlButton);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlButton);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD: {
+				StatemachineControlField statemachineControlField = (StatemachineControlField)theEObject;
+				T result = caseStatemachineControlField(statemachineControlField);
+				if (result == null) result = caseStatemachineControl(statemachineControlField);
+				if (result == null) result = caseStatemachineBase(statemachineControlField);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlField);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO: {
+				StatemachineControlDTO statemachineControlDTO = (StatemachineControlDTO)theEObject;
+				T result = caseStatemachineControlDTO(statemachineControlDTO);
+				if (result == null) result = caseStatemachineControl(statemachineControlDTO);
+				if (result == null) result = caseStatemachineBase(statemachineControlDTO);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlDTO);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER: {
+				StatemachineControlScheduler statemachineControlScheduler = (StatemachineControlScheduler)theEObject;
+				T result = caseStatemachineControlScheduler(statemachineControlScheduler);
+				if (result == null) result = caseStatemachineControl(statemachineControlScheduler);
+				if (result == null) result = caseStatemachineBase(statemachineControlScheduler);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlScheduler);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL: {
+				StatemachineControlPeripheral statemachineControlPeripheral = (StatemachineControlPeripheral)theEObject;
+				T result = caseStatemachineControlPeripheral(statemachineControlPeripheral);
+				if (result == null) result = caseStatemachineControl(statemachineControlPeripheral);
+				if (result == null) result = caseStatemachineBase(statemachineControlPeripheral);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlPeripheral);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE: {
+				StatemachineControlButtonAttribute statemachineControlButtonAttribute = (StatemachineControlButtonAttribute)theEObject;
+				T result = caseStatemachineControlButtonAttribute(statemachineControlButtonAttribute);
+				if (result == null) result = caseStatemachineControlVisibility(statemachineControlButtonAttribute);
+				if (result == null) result = caseStatemachineBase(statemachineControlButtonAttribute);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlButtonAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT: {
+				StatemachineControlButtonAttributeEvent statemachineControlButtonAttributeEvent = (StatemachineControlButtonAttributeEvent)theEObject;
+				T result = caseStatemachineControlButtonAttributeEvent(statemachineControlButtonAttributeEvent);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlButtonAttributeEvent);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD: {
+				StatemachineControlButtonAttributeEventKeyboard statemachineControlButtonAttributeEventKeyboard = (StatemachineControlButtonAttributeEventKeyboard)theEObject;
+				T result = caseStatemachineControlButtonAttributeEventKeyboard(statemachineControlButtonAttributeEventKeyboard);
+				if (result == null) result = caseStatemachineControlButtonAttributeEvent(statemachineControlButtonAttributeEventKeyboard);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlButtonAttributeEventKeyboard);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY: {
+				StatemachineControlButtonAttributeEventIdentity statemachineControlButtonAttributeEventIdentity = (StatemachineControlButtonAttributeEventIdentity)theEObject;
+				T result = caseStatemachineControlButtonAttributeEventIdentity(statemachineControlButtonAttributeEventIdentity);
+				if (result == null) result = caseStatemachineControlButtonAttributeEvent(statemachineControlButtonAttributeEventIdentity);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlButtonAttributeEventIdentity);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT: {
+				StatemachineControlButtonAttributeEventEvent statemachineControlButtonAttributeEventEvent = (StatemachineControlButtonAttributeEventEvent)theEObject;
+				T result = caseStatemachineControlButtonAttributeEventEvent(statemachineControlButtonAttributeEventEvent);
+				if (result == null) result = caseStatemachineControlButtonAttributeEvent(statemachineControlButtonAttributeEventEvent);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlButtonAttributeEventEvent);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_VISIBILITY: {
+				StatemachineControlVisibility statemachineControlVisibility = (StatemachineControlVisibility)theEObject;
+				T result = caseStatemachineControlVisibility(statemachineControlVisibility);
+				if (result == null) result = caseStatemachineBase(statemachineControlVisibility);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlVisibility);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE: {
+				StatemachineControlFieldAttribute statemachineControlFieldAttribute = (StatemachineControlFieldAttribute)theEObject;
+				T result = caseStatemachineControlFieldAttribute(statemachineControlFieldAttribute);
+				if (result == null) result = caseStatemachineControlVisibility(statemachineControlFieldAttribute);
+				if (result == null) result = caseStatemachineBase(statemachineControlFieldAttribute);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlFieldAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_LAYOUT: {
+				StatemachineControlFieldLayout statemachineControlFieldLayout = (StatemachineControlFieldLayout)theEObject;
+				T result = caseStatemachineControlFieldLayout(statemachineControlFieldLayout);
+				if (result == null) result = caseStatemachineControlVisibility(statemachineControlFieldLayout);
+				if (result == null) result = caseStatemachineBase(statemachineControlFieldLayout);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlFieldLayout);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE: {
+				StatemachineControlDTOAttribute statemachineControlDTOAttribute = (StatemachineControlDTOAttribute)theEObject;
+				T result = caseStatemachineControlDTOAttribute(statemachineControlDTOAttribute);
+				if (result == null) result = caseStatemachineBase(statemachineControlDTOAttribute);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlDTOAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE: {
+				StatemachinePeripheralDevice statemachinePeripheralDevice = (StatemachinePeripheralDevice)theEObject;
+				T result = caseStatemachinePeripheralDevice(statemachinePeripheralDevice);
+				if (result == null) result = caseStatemachineBase(statemachinePeripheralDevice);
+				if (result == null) result = caseStatemachineLazyResolver(statemachinePeripheralDevice);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY: {
+				StatemachinePeripheralDeviceLineDisplay statemachinePeripheralDeviceLineDisplay = (StatemachinePeripheralDeviceLineDisplay)theEObject;
+				T result = caseStatemachinePeripheralDeviceLineDisplay(statemachinePeripheralDeviceLineDisplay);
+				if (result == null) result = caseStatemachinePeripheralDevice(statemachinePeripheralDeviceLineDisplay);
+				if (result == null) result = caseStatemachineBase(statemachinePeripheralDeviceLineDisplay);
+				if (result == null) result = caseStatemachineLazyResolver(statemachinePeripheralDeviceLineDisplay);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER: {
+				StatemachinePeripheralDevicePOSPrinter statemachinePeripheralDevicePOSPrinter = (StatemachinePeripheralDevicePOSPrinter)theEObject;
+				T result = caseStatemachinePeripheralDevicePOSPrinter(statemachinePeripheralDevicePOSPrinter);
+				if (result == null) result = caseStatemachinePeripheralDevice(statemachinePeripheralDevicePOSPrinter);
+				if (result == null) result = caseStatemachineBase(statemachinePeripheralDevicePOSPrinter);
+				if (result == null) result = caseStatemachineLazyResolver(statemachinePeripheralDevicePOSPrinter);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER: {
+				StatemachinePeripheralDeviceCashDrawer statemachinePeripheralDeviceCashDrawer = (StatemachinePeripheralDeviceCashDrawer)theEObject;
+				T result = caseStatemachinePeripheralDeviceCashDrawer(statemachinePeripheralDeviceCashDrawer);
+				if (result == null) result = caseStatemachinePeripheralDevice(statemachinePeripheralDeviceCashDrawer);
+				if (result == null) result = caseStatemachineBase(statemachinePeripheralDeviceCashDrawer);
+				if (result == null) result = caseStatemachineLazyResolver(statemachinePeripheralDeviceCashDrawer);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_PT: {
+				StatemachinePeripheralDevicePT statemachinePeripheralDevicePT = (StatemachinePeripheralDevicePT)theEObject;
+				T result = caseStatemachinePeripheralDevicePT(statemachinePeripheralDevicePT);
+				if (result == null) result = caseStatemachinePeripheralDevice(statemachinePeripheralDevicePT);
+				if (result == null) result = caseStatemachineBase(statemachinePeripheralDevicePT);
+				if (result == null) result = caseStatemachineLazyResolver(statemachinePeripheralDevicePT);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE: {
+				StatemachineControlSchedulerAttribute statemachineControlSchedulerAttribute = (StatemachineControlSchedulerAttribute)theEObject;
+				T result = caseStatemachineControlSchedulerAttribute(statemachineControlSchedulerAttribute);
+				if (result == null) result = caseStatemachineBase(statemachineControlSchedulerAttribute);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineControlSchedulerAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_EVENT: {
+				StatemachineEvent statemachineEvent = (StatemachineEvent)theEObject;
+				T result = caseStatemachineEvent(statemachineEvent);
+				if (result == null) result = caseStatemachineBase(statemachineEvent);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineEvent);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_STATE: {
+				StatemachineState statemachineState = (StatemachineState)theEObject;
+				T result = caseStatemachineState(statemachineState);
+				if (result == null) result = caseStatemachineBase(statemachineState);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineState);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER: {
+				StatemachineTrigger statemachineTrigger = (StatemachineTrigger)theEObject;
+				T result = caseStatemachineTrigger(statemachineTrigger);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineTrigger);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION: {
+				StatemachineAction statemachineAction = (StatemachineAction)theEObject;
+				T result = caseStatemachineAction(statemachineAction);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineAction);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE: {
+				StatemachineActionPeripheralBlinkRate statemachineActionPeripheralBlinkRate = (StatemachineActionPeripheralBlinkRate)theEObject;
+				T result = caseStatemachineActionPeripheralBlinkRate(statemachineActionPeripheralBlinkRate);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralBlinkRate);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralBlinkRate);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR: {
+				StatemachineActionPeripheralClear statemachineActionPeripheralClear = (StatemachineActionPeripheralClear)theEObject;
+				T result = caseStatemachineActionPeripheralClear(statemachineActionPeripheralClear);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralClear);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralClear);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW: {
+				StatemachineActionPeripheralCreateWindow statemachineActionPeripheralCreateWindow = (StatemachineActionPeripheralCreateWindow)theEObject;
+				T result = caseStatemachineActionPeripheralCreateWindow(statemachineActionPeripheralCreateWindow);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralCreateWindow);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralCreateWindow);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE: {
+				StatemachineActionPeripheralCursorType statemachineActionPeripheralCursorType = (StatemachineActionPeripheralCursorType)theEObject;
+				T result = caseStatemachineActionPeripheralCursorType(statemachineActionPeripheralCursorType);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralCursorType);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralCursorType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW: {
+				StatemachineActionPeripheralDestroyWindow statemachineActionPeripheralDestroyWindow = (StatemachineActionPeripheralDestroyWindow)theEObject;
+				T result = caseStatemachineActionPeripheralDestroyWindow(statemachineActionPeripheralDestroyWindow);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralDestroyWindow);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralDestroyWindow);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS: {
+				StatemachineActionPeripheralDeviceBrightness statemachineActionPeripheralDeviceBrightness = (StatemachineActionPeripheralDeviceBrightness)theEObject;
+				T result = caseStatemachineActionPeripheralDeviceBrightness(statemachineActionPeripheralDeviceBrightness);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralDeviceBrightness);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralDeviceBrightness);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP: {
+				StatemachineActionPeripheralDisplayBitmap statemachineActionPeripheralDisplayBitmap = (StatemachineActionPeripheralDisplayBitmap)theEObject;
+				T result = caseStatemachineActionPeripheralDisplayBitmap(statemachineActionPeripheralDisplayBitmap);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralDisplayBitmap);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralDisplayBitmap);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT: {
+				StatemachineActionPeripheralDisplayText statemachineActionPeripheralDisplayText = (StatemachineActionPeripheralDisplayText)theEObject;
+				T result = caseStatemachineActionPeripheralDisplayText(statemachineActionPeripheralDisplayText);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralDisplayText);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralDisplayText);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT: {
+				StatemachineActionPeripheralDisplayTextAt statemachineActionPeripheralDisplayTextAt = (StatemachineActionPeripheralDisplayTextAt)theEObject;
+				T result = caseStatemachineActionPeripheralDisplayTextAt(statemachineActionPeripheralDisplayTextAt);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralDisplayTextAt);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralDisplayTextAt);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT: {
+				StatemachineActionPeripheralInterCharacterWait statemachineActionPeripheralInterCharacterWait = (StatemachineActionPeripheralInterCharacterWait)theEObject;
+				T result = caseStatemachineActionPeripheralInterCharacterWait(statemachineActionPeripheralInterCharacterWait);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralInterCharacterWait);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralInterCharacterWait);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT: {
+				StatemachineActionPeripheralMarqueeFormat statemachineActionPeripheralMarqueeFormat = (StatemachineActionPeripheralMarqueeFormat)theEObject;
+				T result = caseStatemachineActionPeripheralMarqueeFormat(statemachineActionPeripheralMarqueeFormat);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralMarqueeFormat);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralMarqueeFormat);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT: {
+				StatemachineActionPeripheralMarqueeRepeatWait statemachineActionPeripheralMarqueeRepeatWait = (StatemachineActionPeripheralMarqueeRepeatWait)theEObject;
+				T result = caseStatemachineActionPeripheralMarqueeRepeatWait(statemachineActionPeripheralMarqueeRepeatWait);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralMarqueeRepeatWait);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralMarqueeRepeatWait);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE: {
+				StatemachineActionPeripheralMarqueeType statemachineActionPeripheralMarqueeType = (StatemachineActionPeripheralMarqueeType)theEObject;
+				T result = caseStatemachineActionPeripheralMarqueeType(statemachineActionPeripheralMarqueeType);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralMarqueeType);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralMarqueeType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT: {
+				StatemachineActionPeripheralMarqueeUnitWait statemachineActionPeripheralMarqueeUnitWait = (StatemachineActionPeripheralMarqueeUnitWait)theEObject;
+				T result = caseStatemachineActionPeripheralMarqueeUnitWait(statemachineActionPeripheralMarqueeUnitWait);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralMarqueeUnitWait);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralMarqueeUnitWait);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL: {
+				StatemachineActionPeripheralScroll statemachineActionPeripheralScroll = (StatemachineActionPeripheralScroll)theEObject;
+				T result = caseStatemachineActionPeripheralScroll(statemachineActionPeripheralScroll);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralScroll);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralScroll);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER: {
+				StatemachineActionPeripheralOpenDrawer statemachineActionPeripheralOpenDrawer = (StatemachineActionPeripheralOpenDrawer)theEObject;
+				T result = caseStatemachineActionPeripheralOpenDrawer(statemachineActionPeripheralOpenDrawer);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralOpenDrawer);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralOpenDrawer);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE: {
+				StatemachineActionPeripheralPrintBarcode statemachineActionPeripheralPrintBarcode = (StatemachineActionPeripheralPrintBarcode)theEObject;
+				T result = caseStatemachineActionPeripheralPrintBarcode(statemachineActionPeripheralPrintBarcode);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPrintBarcode);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPrintBarcode);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP: {
+				StatemachineActionPeripheralPrintBitmap statemachineActionPeripheralPrintBitmap = (StatemachineActionPeripheralPrintBitmap)theEObject;
+				T result = caseStatemachineActionPeripheralPrintBitmap(statemachineActionPeripheralPrintBitmap);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPrintBitmap);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPrintBitmap);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT: {
+				StatemachineActionPeripheralPrintCut statemachineActionPeripheralPrintCut = (StatemachineActionPeripheralPrintCut)theEObject;
+				T result = caseStatemachineActionPeripheralPrintCut(statemachineActionPeripheralPrintCut);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPrintCut);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPrintCut);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP: {
+				StatemachineActionPeripheralPrintRegisterBitmap statemachineActionPeripheralPrintRegisterBitmap = (StatemachineActionPeripheralPrintRegisterBitmap)theEObject;
+				T result = caseStatemachineActionPeripheralPrintRegisterBitmap(statemachineActionPeripheralPrintRegisterBitmap);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPrintRegisterBitmap);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPrintRegisterBitmap);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL: {
+				StatemachineActionPeripheralPrintNormal statemachineActionPeripheralPrintNormal = (StatemachineActionPeripheralPrintNormal)theEObject;
+				T result = caseStatemachineActionPeripheralPrintNormal(statemachineActionPeripheralPrintNormal);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPrintNormal);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPrintNormal);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN: {
+				StatemachineActionPeripheralPTOpen statemachineActionPeripheralPTOpen = (StatemachineActionPeripheralPTOpen)theEObject;
+				T result = caseStatemachineActionPeripheralPTOpen(statemachineActionPeripheralPTOpen);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPTOpen);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPTOpen);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE: {
+				StatemachineActionPeripheralPTClose statemachineActionPeripheralPTClose = (StatemachineActionPeripheralPTClose)theEObject;
+				T result = caseStatemachineActionPeripheralPTClose(statemachineActionPeripheralPTClose);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPTClose);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPTClose);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL: {
+				StatemachineActionPeripheralPTReversal statemachineActionPeripheralPTReversal = (StatemachineActionPeripheralPTReversal)theEObject;
+				T result = caseStatemachineActionPeripheralPTReversal(statemachineActionPeripheralPTReversal);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPTReversal);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPTReversal);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE: {
+				StatemachineActionPeripheralPTAcknowledge statemachineActionPeripheralPTAcknowledge = (StatemachineActionPeripheralPTAcknowledge)theEObject;
+				T result = caseStatemachineActionPeripheralPTAcknowledge(statemachineActionPeripheralPTAcknowledge);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPTAcknowledge);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPTAcknowledge);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION: {
+				StatemachineActionPeripheralPTRegistration statemachineActionPeripheralPTRegistration = (StatemachineActionPeripheralPTRegistration)theEObject;
+				T result = caseStatemachineActionPeripheralPTRegistration(statemachineActionPeripheralPTRegistration);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPTRegistration);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPTRegistration);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION: {
+				StatemachineActionPeripheralPTAuthorization statemachineActionPeripheralPTAuthorization = (StatemachineActionPeripheralPTAuthorization)theEObject;
+				T result = caseStatemachineActionPeripheralPTAuthorization(statemachineActionPeripheralPTAuthorization);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPTAuthorization);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPTAuthorization);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE: {
+				StatemachineActionPeripheralPTResponse statemachineActionPeripheralPTResponse = (StatemachineActionPeripheralPTResponse)theEObject;
+				T result = caseStatemachineActionPeripheralPTResponse(statemachineActionPeripheralPTResponse);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionPeripheralPTResponse);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPTResponse);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPTResponse);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT: {
+				StatemachineActionPeripheralPrintReport statemachineActionPeripheralPrintReport = (StatemachineActionPeripheralPrintReport)theEObject;
+				T result = caseStatemachineActionPeripheralPrintReport(statemachineActionPeripheralPrintReport);
+				if (result == null) result = caseStatemachineAction(statemachineActionPeripheralPrintReport);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionPeripheralPrintReport);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE: {
+				StatemachineActionFieldSource statemachineActionFieldSource = (StatemachineActionFieldSource)theEObject;
+				T result = caseStatemachineActionFieldSource(statemachineActionFieldSource);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldSource);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldSource);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_STRING: {
+				StatemachineActionFieldSourceString statemachineActionFieldSourceString = (StatemachineActionFieldSourceString)theEObject;
+				T result = caseStatemachineActionFieldSourceString(statemachineActionFieldSourceString);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionFieldSourceString);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldSourceString);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldSourceString);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER: {
+				StatemachineActionFieldSourceNumber statemachineActionFieldSourceNumber = (StatemachineActionFieldSourceNumber)theEObject;
+				T result = caseStatemachineActionFieldSourceNumber(statemachineActionFieldSourceNumber);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionFieldSourceNumber);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldSourceNumber);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldSourceNumber);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE: {
+				StatemachineActionFieldSourceEvaluate statemachineActionFieldSourceEvaluate = (StatemachineActionFieldSourceEvaluate)theEObject;
+				T result = caseStatemachineActionFieldSourceEvaluate(statemachineActionFieldSourceEvaluate);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionFieldSourceEvaluate);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldSourceEvaluate);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldSourceEvaluate);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE: {
+				StatemachineActionFieldSourceTranslate statemachineActionFieldSourceTranslate = (StatemachineActionFieldSourceTranslate)theEObject;
+				T result = caseStatemachineActionFieldSourceTranslate(statemachineActionFieldSourceTranslate);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionFieldSourceTranslate);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldSourceTranslate);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldSourceTranslate);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE: {
+				StatemachineActionFieldSourceDtoAttribute statemachineActionFieldSourceDtoAttribute = (StatemachineActionFieldSourceDtoAttribute)theEObject;
+				T result = caseStatemachineActionFieldSourceDtoAttribute(statemachineActionFieldSourceDtoAttribute);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionFieldSourceDtoAttribute);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldSourceDtoAttribute);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldSourceDtoAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVENT: {
+				StatemachineActionFieldSourceEvent statemachineActionFieldSourceEvent = (StatemachineActionFieldSourceEvent)theEObject;
+				T result = caseStatemachineActionFieldSourceEvent(statemachineActionFieldSourceEvent);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionFieldSourceEvent);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldSourceEvent);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldSourceEvent);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION: {
+				StatemachineActionConditionalTransition statemachineActionConditionalTransition = (StatemachineActionConditionalTransition)theEObject;
+				T result = caseStatemachineActionConditionalTransition(statemachineActionConditionalTransition);
+				if (result == null) result = caseStatemachineAction(statemachineActionConditionalTransition);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionConditionalTransition);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER: {
+				StatemachineOperationParameter statemachineOperationParameter = (StatemachineOperationParameter)theEObject;
+				T result = caseStatemachineOperationParameter(statemachineOperationParameter);
+				if (result == null) result = caseStatemachineAction(statemachineOperationParameter);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineOperationParameter);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION: {
+				StatemachineOperation statemachineOperation = (StatemachineOperation)theEObject;
+				T result = caseStatemachineOperation(statemachineOperation);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineOperation);
+				if (result == null) result = caseStatemachineAction(statemachineOperation);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineOperation);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_GUARD: {
+				StatemachineGuard statemachineGuard = (StatemachineGuard)theEObject;
+				T result = caseStatemachineGuard(statemachineGuard);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineGuard);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION: {
+				StatemachineFunction statemachineFunction = (StatemachineFunction)theEObject;
+				T result = caseStatemachineFunction(statemachineFunction);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineFunction);
+				if (result == null) result = caseStatemachineAction(statemachineFunction);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineFunction);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE: {
+				StatemachineStorageRetrieve statemachineStorageRetrieve = (StatemachineStorageRetrieve)theEObject;
+				T result = caseStatemachineStorageRetrieve(statemachineStorageRetrieve);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineStorageRetrieve);
+				if (result == null) result = caseStatemachineAction(statemachineStorageRetrieve);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineStorageRetrieve);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE: {
+				StatemachineStorage statemachineStorage = (StatemachineStorage)theEObject;
+				T result = caseStatemachineStorage(statemachineStorage);
+				if (result == null) result = caseStatemachineAction(statemachineStorage);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineStorage);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION: {
+				StatemachineActionFieldConcatenation statemachineActionFieldConcatenation = (StatemachineActionFieldConcatenation)theEObject;
+				T result = caseStatemachineActionFieldConcatenation(statemachineActionFieldConcatenation);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldConcatenation);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldConcatenation);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET: {
+				StatemachineActionFieldSet statemachineActionFieldSet = (StatemachineActionFieldSet)theEObject;
+				T result = caseStatemachineActionFieldSet(statemachineActionFieldSet);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldSet);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldSet);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_KEYSTROKE: {
+				StatemachineActionFieldKeystroke statemachineActionFieldKeystroke = (StatemachineActionFieldKeystroke)theEObject;
+				T result = caseStatemachineActionFieldKeystroke(statemachineActionFieldKeystroke);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldKeystroke);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldKeystroke);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR: {
+				StatemachineActionFieldClear statemachineActionFieldClear = (StatemachineActionFieldClear)theEObject;
+				T result = caseStatemachineActionFieldClear(statemachineActionFieldClear);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldClear);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldClear);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET: {
+				StatemachineActionFieldGet statemachineActionFieldGet = (StatemachineActionFieldGet)theEObject;
+				T result = caseStatemachineActionFieldGet(statemachineActionFieldGet);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionFieldGet);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldGet);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldGet);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE: {
+				StatemachineActionFieldRemove statemachineActionFieldRemove = (StatemachineActionFieldRemove)theEObject;
+				T result = caseStatemachineActionFieldRemove(statemachineActionFieldRemove);
+				if (result == null) result = caseStatemachineActionFieldSource(statemachineActionFieldRemove);
+				if (result == null) result = caseStatemachineAction(statemachineActionFieldRemove);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionFieldRemove);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE: {
+				StatemachineActionItemVisible statemachineActionItemVisible = (StatemachineActionItemVisible)theEObject;
+				T result = caseStatemachineActionItemVisible(statemachineActionItemVisible);
+				if (result == null) result = caseStatemachineAction(statemachineActionItemVisible);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionItemVisible);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE: {
+				StatemachineActionItemInvisible statemachineActionItemInvisible = (StatemachineActionItemInvisible)theEObject;
+				T result = caseStatemachineActionItemInvisible(statemachineActionItemInvisible);
+				if (result == null) result = caseStatemachineAction(statemachineActionItemInvisible);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionItemInvisible);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION: {
+				StatemachineActionButtonCaption statemachineActionButtonCaption = (StatemachineActionButtonCaption)theEObject;
+				T result = caseStatemachineActionButtonCaption(statemachineActionButtonCaption);
+				if (result == null) result = caseStatemachineAction(statemachineActionButtonCaption);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionButtonCaption);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE: {
+				StatemachineActionButtonImage statemachineActionButtonImage = (StatemachineActionButtonImage)theEObject;
+				T result = caseStatemachineActionButtonImage(statemachineActionButtonImage);
+				if (result == null) result = caseStatemachineAction(statemachineActionButtonImage);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionButtonImage);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND: {
+				StatemachineActionDTOFind statemachineActionDTOFind = (StatemachineActionDTOFind)theEObject;
+				T result = caseStatemachineActionDTOFind(statemachineActionDTOFind);
+				if (result == null) result = caseStatemachineAction(statemachineActionDTOFind);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionDTOFind);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER: {
+				StatemachineActionScheduler statemachineActionScheduler = (StatemachineActionScheduler)theEObject;
+				T result = caseStatemachineActionScheduler(statemachineActionScheduler);
+				if (result == null) result = caseStatemachineAction(statemachineActionScheduler);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineActionScheduler);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_DTO_TYPE: {
+				StatemachineDTOType statemachineDTOType = (StatemachineDTOType)theEObject;
+				T result = caseStatemachineDTOType(statemachineDTOType);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineDTOType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachineDSLPackage.STATEMACHINE_FIELD_TYPE: {
+				StatemachineFieldType statemachineFieldType = (StatemachineFieldType)theEObject;
+				T result = caseStatemachineFieldType(statemachineFieldType);
+				if (result == null) result = caseStatemachineLazyResolver(statemachineFieldType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Model</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Model</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineModel(StatemachineModel object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Lazy Resolver</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Lazy Resolver</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineLazyResolver(StatemachineLazyResolver object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Base</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Base</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineBase(StatemachineBase object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Package</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Package</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachinePackage(StatemachinePackage object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachine(Statemachine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControl(StatemachineControl object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Button</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Button</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlButton(StatemachineControlButton object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Field</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Field</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlField(StatemachineControlField object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control DTO</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control DTO</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlDTO(StatemachineControlDTO object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Scheduler</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Scheduler</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlScheduler(StatemachineControlScheduler object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Peripheral</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Peripheral</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlPeripheral(StatemachineControlPeripheral object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlButtonAttribute(StatemachineControlButtonAttribute object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute Event</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute Event</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlButtonAttributeEvent(StatemachineControlButtonAttributeEvent object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute Event Keyboard</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute Event Keyboard</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlButtonAttributeEventKeyboard(StatemachineControlButtonAttributeEventKeyboard object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute Event Identity</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute Event Identity</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlButtonAttributeEventIdentity(StatemachineControlButtonAttributeEventIdentity object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute Event Event</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Button Attribute Event Event</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlButtonAttributeEventEvent(StatemachineControlButtonAttributeEventEvent object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Visibility</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Visibility</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlVisibility(StatemachineControlVisibility object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Field Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Field Attribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlFieldAttribute(StatemachineControlFieldAttribute object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Field Layout</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Field Layout</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlFieldLayout(StatemachineControlFieldLayout object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control DTO Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control DTO Attribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlDTOAttribute(StatemachineControlDTOAttribute object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachinePeripheralDevice(StatemachinePeripheralDevice object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device Line Display</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device Line Display</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachinePeripheralDeviceLineDisplay(StatemachinePeripheralDeviceLineDisplay object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device POS Printer</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device POS Printer</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachinePeripheralDevicePOSPrinter(StatemachinePeripheralDevicePOSPrinter object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device Cash Drawer</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device Cash Drawer</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachinePeripheralDeviceCashDrawer(StatemachinePeripheralDeviceCashDrawer object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device PT</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Peripheral Device PT</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachinePeripheralDevicePT(StatemachinePeripheralDevicePT object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Control Scheduler Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Control Scheduler Attribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineControlSchedulerAttribute(StatemachineControlSchedulerAttribute object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Event</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Event</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineEvent(StatemachineEvent object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine State</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine State</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineState(StatemachineState object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Trigger</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Trigger</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineTrigger(StatemachineTrigger object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineAction(StatemachineAction object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Blink Rate</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Blink Rate</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralBlinkRate(StatemachineActionPeripheralBlinkRate object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Clear</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Clear</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralClear(StatemachineActionPeripheralClear object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Create Window</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Create Window</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralCreateWindow(StatemachineActionPeripheralCreateWindow object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Cursor Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Cursor Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralCursorType(StatemachineActionPeripheralCursorType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Destroy Window</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Destroy Window</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralDestroyWindow(StatemachineActionPeripheralDestroyWindow object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Device Brightness</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Device Brightness</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralDeviceBrightness(StatemachineActionPeripheralDeviceBrightness object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Display Bitmap</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Display Bitmap</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralDisplayBitmap(StatemachineActionPeripheralDisplayBitmap object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Display Text</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Display Text</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralDisplayText(StatemachineActionPeripheralDisplayText object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Display Text At</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Display Text At</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralDisplayTextAt(StatemachineActionPeripheralDisplayTextAt object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Inter Character Wait</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Inter Character Wait</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralInterCharacterWait(StatemachineActionPeripheralInterCharacterWait object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Marquee Format</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Marquee Format</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralMarqueeFormat(StatemachineActionPeripheralMarqueeFormat object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Marquee Repeat Wait</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Marquee Repeat Wait</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralMarqueeRepeatWait(StatemachineActionPeripheralMarqueeRepeatWait object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Marquee Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Marquee Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralMarqueeType(StatemachineActionPeripheralMarqueeType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Marquee Unit Wait</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Marquee Unit Wait</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralMarqueeUnitWait(StatemachineActionPeripheralMarqueeUnitWait object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Scroll</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Scroll</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralScroll(StatemachineActionPeripheralScroll object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Open Drawer</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Open Drawer</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralOpenDrawer(StatemachineActionPeripheralOpenDrawer object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Barcode</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Barcode</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPrintBarcode(StatemachineActionPeripheralPrintBarcode object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Bitmap</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Bitmap</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPrintBitmap(StatemachineActionPeripheralPrintBitmap object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Cut</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Cut</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPrintCut(StatemachineActionPeripheralPrintCut object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Register Bitmap</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Register Bitmap</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPrintRegisterBitmap(StatemachineActionPeripheralPrintRegisterBitmap object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Normal</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Normal</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPrintNormal(StatemachineActionPeripheralPrintNormal object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Open</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Open</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPTOpen(StatemachineActionPeripheralPTOpen object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Close</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Close</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPTClose(StatemachineActionPeripheralPTClose object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Reversal</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Reversal</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPTReversal(StatemachineActionPeripheralPTReversal object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Acknowledge</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Acknowledge</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPTAcknowledge(StatemachineActionPeripheralPTAcknowledge object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Registration</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Registration</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPTRegistration(StatemachineActionPeripheralPTRegistration object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Authorization</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Authorization</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPTAuthorization(StatemachineActionPeripheralPTAuthorization object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Response</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral PT Response</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPTResponse(StatemachineActionPeripheralPTResponse object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Report</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Peripheral Print Report</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionPeripheralPrintReport(StatemachineActionPeripheralPrintReport object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Source</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Source</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldSource(StatemachineActionFieldSource object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Source String</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Source String</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldSourceString(StatemachineActionFieldSourceString object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Number</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Number</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldSourceNumber(StatemachineActionFieldSourceNumber object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Evaluate</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Evaluate</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldSourceEvaluate(StatemachineActionFieldSourceEvaluate object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Translate</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Translate</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldSourceTranslate(StatemachineActionFieldSourceTranslate object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Dto Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Dto Attribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldSourceDtoAttribute(StatemachineActionFieldSourceDtoAttribute object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Event</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Source Event</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldSourceEvent(StatemachineActionFieldSourceEvent object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Conditional Transition</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Conditional Transition</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionConditionalTransition(StatemachineActionConditionalTransition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Operation Parameter</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Operation Parameter</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineOperationParameter(StatemachineOperationParameter object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Operation</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Operation</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineOperation(StatemachineOperation object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Guard</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Guard</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineGuard(StatemachineGuard object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Function</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Function</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineFunction(StatemachineFunction object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Storage Retrieve</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Storage Retrieve</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineStorageRetrieve(StatemachineStorageRetrieve object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Storage</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Storage</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineStorage(StatemachineStorage object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Concatenation</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Concatenation</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldConcatenation(StatemachineActionFieldConcatenation object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Set</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Set</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldSet(StatemachineActionFieldSet object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Keystroke</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Keystroke</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldKeystroke(StatemachineActionFieldKeystroke object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Clear</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Clear</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldClear(StatemachineActionFieldClear object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Get</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Get</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldGet(StatemachineActionFieldGet object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Field Remove</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Field Remove</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionFieldRemove(StatemachineActionFieldRemove object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Item Visible</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Item Visible</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionItemVisible(StatemachineActionItemVisible object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Item Invisible</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Item Invisible</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionItemInvisible(StatemachineActionItemInvisible object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Button Caption</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Button Caption</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionButtonCaption(StatemachineActionButtonCaption object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Button Image</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Button Image</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionButtonImage(StatemachineActionButtonImage object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action DTO Find</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action DTO Find</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionDTOFind(StatemachineActionDTOFind object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Action Scheduler</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Action Scheduler</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineActionScheduler(StatemachineActionScheduler object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine DTO Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine DTO Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineDTOType(StatemachineDTOType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine Field Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine Field Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachineFieldType(StatemachineFieldType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>LLazy Resolver</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>LLazy Resolver</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLLazyResolver(LLazyResolver object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>LPackage</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>LPackage</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLPackage(LPackage object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //StatemachineDSLSwitch
diff --git a/org.eclipse.osbp.xtext.statemachine/epl-v10.html b/org.eclipse.osbp.xtext.statemachine/epl-v10.html
new file mode 100644
index 0000000..b398acc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/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.statemachine/license.html b/org.eclipse.osbp.xtext.statemachine/license.html
new file mode 100644
index 0000000..6e579a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/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.statemachine/model/StatemachineDSL.xcore b/org.eclipse.osbp.xtext.statemachine/model/StatemachineDSL.xcore
new file mode 100644
index 0000000..38089a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/model/StatemachineDSL.xcore
@@ -0,0 +1,583 @@
+@GenModel(fileExtensions="statemachine")
+@GenModel(modelName="StatemachineDSL")
+@GenModel(prefix="StatemachineDSL")
+@GenModel(updateClasspath="false")
+@GenModel(copyrightText="Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ All rights reserved. This program and the accompanying materials 
+ are made available under the terms of the Eclipse Public License v1.0 
+ which accompanies this distribution, and is available at 
+ http://www.eclipse.org/legal/epl-v10.html 
+
+ Based on ideas from Xtext, Xtend, Xcore
+  
+ Contributors:  
+ 		Joerg Riegel - Initial implementation 
+ ")
+@Ecore(nsURI="http://osbp.eclipse.org/xtext/statemachine/StatemachineDSL")
+@Ecore(nsPrefix="statemachinedsl")
+@Ecore(rootPackage="statemachinedsl")
+package org.eclipse.osbp.xtext.statemachine
+
+import org.eclipse.osbp.dsl.semantic.common.types.LPackage
+import org.eclipse.osbp.dsl.semantic.dto.LDto
+import org.eclipse.osbp.dsl.xtext.lazyresolver.api.EcoreUtil3
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryGuard
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryOperation
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryFunction
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryStatemachineGroup
+import org.eclipse.osbp.xtext.reportdsl.Report
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.InternalEObject
+
+class StatemachineModel {
+	contains StatemachinePackage[] packages
+}
+
+type InternalEObject wraps InternalEObject
+
+class StatemachineLazyResolver {
+	op EObject eResolveProxy(InternalEObject proxy) {
+		return EcoreUtil3.resolve(proxy, this.eResource().resourceSet);
+	}
+}
+
+class StatemachineBase extends StatemachineLazyResolver{
+	String name
+}
+
+class StatemachinePackage extends LPackage{
+	contains Statemachine[] statemachines
+}
+
+class Statemachine extends StatemachineBase{
+	boolean description
+	String descriptionValue
+	refers FunctionLibraryStatemachineGroup functionGroup
+	refers StatemachineEvent initialEvent
+	refers StatemachineState initialState
+	contains StatemachineEvent[] events
+	contains StatemachineControl[] controls
+	contains StatemachineState[] states
+}
+
+interface StatemachineControl extends StatemachineBase{
+}
+
+class StatemachineControlButton extends StatemachineControl, StatemachineControlVisibility{
+	StatemachineControlButtonEventType eventType	
+	contains StatemachineControlButtonAttribute[] buttons
+}
+
+class StatemachineControlField extends StatemachineControl{
+	contains StatemachineControlFieldAttribute[] fields
+	contains StatemachineControlFieldLayout[] layouts
+}
+
+class StatemachineControlDTO extends StatemachineControl{
+	contains StatemachineControlDTOAttribute[] dtos
+}
+
+class StatemachineControlScheduler extends StatemachineControl{
+	contains StatemachineControlSchedulerAttribute[] schedulers
+}
+
+class StatemachineControlPeripheral extends StatemachineControl{
+	contains StatemachinePeripheralDeviceLineDisplay[] lineDisplays
+	contains StatemachinePeripheralDevicePOSPrinter[] posPrinters
+	contains StatemachinePeripheralDeviceCashDrawer[] cashDrawers
+	contains StatemachinePeripheralDevicePT[] paymentTerminals
+}
+
+class StatemachineControlButtonAttribute extends StatemachineControlVisibility{
+	boolean hasImage
+	String image
+	contains StatemachineControlButtonAttributeEvent event 
+}
+
+interface StatemachineControlButtonAttributeEvent extends StatemachineLazyResolver {
+}
+
+class StatemachineControlButtonAttributeEventKeyboard extends StatemachineControlButtonAttributeEvent {
+	String keystroke
+}
+
+class StatemachineControlButtonAttributeEventIdentity extends StatemachineControlButtonAttributeEvent {
+	int identity
+}
+
+class StatemachineControlButtonAttributeEventEvent extends StatemachineControlButtonAttributeEvent {
+	refers StatemachineEvent event
+}
+
+interface StatemachineControlVisibility extends StatemachineBase{
+}
+
+class StatemachineControlFieldAttribute extends StatemachineControlVisibility{
+	contains StatemachineFieldType attributeType
+}
+
+class StatemachineControlFieldLayout extends StatemachineControlVisibility{
+}
+
+class StatemachineControlDTOAttribute extends StatemachineBase{
+	contains StatemachineDTOType attributeType
+	boolean hasEvent
+	refers StatemachineEvent event
+}
+
+interface StatemachinePeripheralDevice extends StatemachineBase {
+}
+
+class StatemachinePeripheralDeviceLineDisplay extends StatemachinePeripheralDevice {
+} 
+class StatemachinePeripheralDevicePOSPrinter extends StatemachinePeripheralDevice {
+} 
+class StatemachinePeripheralDeviceCashDrawer extends StatemachinePeripheralDevice {
+} 
+class StatemachinePeripheralDevicePT extends StatemachinePeripheralDevice {
+} 
+
+class StatemachineControlSchedulerAttribute extends StatemachineBase{
+	int delay 
+	refers StatemachineEvent event
+}
+
+class StatemachineEvent extends StatemachineBase{
+}
+
+class StatemachineState extends StatemachineBase{
+	contains StatemachineTrigger[] triggers
+	contains StatemachineOperation identity
+	refers StatemachineControlFieldAttribute keystroke
+	boolean hasKeyOperation
+	contains StatemachineOperation keyOperation
+}
+
+class StatemachineTrigger extends StatemachineLazyResolver{
+	boolean hasTransition
+	refers StatemachineState transition
+	refers StatemachineEvent[] triggers
+	contains StatemachineGuard[] guards
+	contains StatemachineAction[] actions
+}
+
+interface StatemachineAction extends StatemachineLazyResolver{
+}
+
+class StatemachineActionPeripheralBlinkRate extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	int blinkRate
+}
+
+class StatemachineActionPeripheralClear extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+}
+
+class StatemachineActionPeripheralCreateWindow extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	int viewportRow
+	int viewportColumn
+	int viewportHeight
+	int viewportWidth
+	int windowHeight
+	int windowWidth
+}
+
+class StatemachineActionPeripheralCursorType extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	StatemachineLineDisplayCursorType cursorType
+}
+
+class StatemachineActionPeripheralDestroyWindow extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+}
+
+class StatemachineActionPeripheralDeviceBrightness extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	int brightness
+}
+
+class StatemachineActionPeripheralDisplayBitmap extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	int bitmapId
+}
+
+class StatemachineActionPeripheralDisplayText extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	contains StatemachineActionFieldConcatenation text
+	boolean hasType
+	StatemachineLineDisplayTextType textType
+}
+
+class StatemachineActionPeripheralDisplayTextAt extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	int row
+	int column
+	contains StatemachineActionFieldConcatenation text
+	boolean hasType
+	StatemachineLineDisplayTextType textType
+}
+
+class StatemachineActionPeripheralInterCharacterWait extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	int wait
+}
+
+class StatemachineActionPeripheralMarqueeFormat extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	StatemachineLineDisplayMarqueeFormat format
+}
+
+class StatemachineActionPeripheralMarqueeRepeatWait extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	int wait
+}
+
+class StatemachineActionPeripheralMarqueeType extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	StatemachineLineDisplayMarqueeType marqueeType
+}
+
+class StatemachineActionPeripheralMarqueeUnitWait extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	int wait
+}
+
+class StatemachineActionPeripheralScroll extends StatemachineAction {
+	refers StatemachinePeripheralDeviceLineDisplay device
+	StatemachineLineDisplayScrollTextType direction
+	int units
+}
+
+class StatemachineActionPeripheralOpenDrawer extends StatemachineAction {
+	refers StatemachinePeripheralDeviceCashDrawer device
+}
+
+class StatemachineActionPeripheralPrintBarcode extends StatemachineAction {
+	refers StatemachinePeripheralDevicePOSPrinter device
+	String data
+	StatemachinePOSPrinterBarcodeType barcodeType
+}
+
+class StatemachineActionPeripheralPrintBitmap extends StatemachineAction {
+	refers StatemachinePeripheralDevicePOSPrinter device
+	int bitmapId
+}
+
+class StatemachineActionPeripheralPrintCut extends StatemachineAction {
+	refers StatemachinePeripheralDevicePOSPrinter device
+	contains StatemachineActionFieldConcatenation text
+}
+
+class StatemachineActionPeripheralPrintRegisterBitmap extends StatemachineAction {
+	refers StatemachinePeripheralDevicePOSPrinter device
+	int bitmapId
+	String name
+}
+
+class StatemachineActionPeripheralPrintNormal extends StatemachineAction {
+	refers StatemachinePeripheralDevicePOSPrinter device
+	contains StatemachineActionFieldConcatenation text
+	StatemachinePOSPrinterBarcodeType barcodeType
+}
+
+class StatemachineActionPeripheralPTOpen extends StatemachineAction {
+	refers StatemachinePeripheralDevicePT device
+	contains StatemachineActionFieldConcatenation host 
+	contains StatemachineActionFieldConcatenation port 
+}
+
+class StatemachineActionPeripheralPTClose extends StatemachineAction {
+	refers StatemachinePeripheralDevicePT device
+}
+
+//class StatemachineActionPeripheralPTBalanceRequest extends StatemachineActionFieldSource {
+//	refers StatemachinePeripheralDevicePT device
+//}
+//
+//class StatemachineActionPeripheralPTPrepaidTopUp extends StatemachineAction {
+//	refers StatemachinePeripheralDevicePT device
+//	contains StatemachineActionFieldConcatenation source
+//}
+//
+class StatemachineActionPeripheralPTReversal extends StatemachineAction {
+	refers StatemachinePeripheralDevicePT device
+	contains StatemachineActionFieldConcatenation password
+	contains StatemachineActionFieldConcatenation receipt
+}
+
+class StatemachineActionPeripheralPTAcknowledge extends StatemachineAction {
+	refers StatemachinePeripheralDevicePT device
+}
+
+class StatemachineActionPeripheralPTRegistration extends StatemachineAction {
+	refers StatemachinePeripheralDevicePT device
+	contains StatemachineActionFieldConcatenation password
+	String configuration
+}
+
+class StatemachineActionPeripheralPTAuthorization extends StatemachineAction {
+	refers StatemachinePeripheralDevicePT device
+	contains StatemachineActionFieldConcatenation amount
+}
+
+class StatemachineActionPeripheralPTResponse extends StatemachineActionFieldSource {
+	refers StatemachinePeripheralDevicePT device
+}
+
+class StatemachineActionPeripheralPrintReport extends StatemachineAction {
+	refers Report report
+	refers StatemachineStorage key
+	boolean hasFilter
+}
+
+interface StatemachineActionFieldSource extends StatemachineAction {
+}
+
+class StatemachineActionFieldSourceString extends StatemachineActionFieldSource {
+	String text
+} 
+
+class StatemachineActionFieldSourceNumber extends StatemachineActionFieldSource {
+	Double value
+}
+
+class StatemachineActionFieldSourceEvaluate extends StatemachineActionFieldSource {
+	StatemachineEvaluationType evaluationtype	
+}
+
+class StatemachineActionFieldSourceTranslate extends StatemachineActionFieldSource {
+	String text	
+}
+
+class StatemachineActionFieldSourceDtoAttribute extends StatemachineActionFieldSource {
+	refers StatemachineControlDTOAttribute dto
+	refers LDtoInheritedAttribute attribute
+}
+
+class StatemachineActionFieldSourceEvent extends StatemachineActionFieldSource {
+}
+
+class StatemachineActionConditionalTransition extends StatemachineAction {
+	refers StatemachineState transition
+	contains StatemachineGuard guard
+	contains StatemachineAction[] actions
+}
+
+class StatemachineOperationParameter extends StatemachineAction {
+	contains StatemachineActionFieldConcatenation source
+}
+
+class StatemachineOperation extends StatemachineActionFieldSource {
+	refers FunctionLibraryOperation operation
+	contains StatemachineOperationParameter first
+	contains StatemachineOperationParameter[] more
+}
+
+class StatemachineGuard extends StatemachineLazyResolver{
+	refers FunctionLibraryGuard guard
+	boolean hasOnFail
+	String onFailDescription
+	String onFailCaption
+	StatemachineUserMessageType onFailType
+}
+
+class StatemachineFunction extends StatemachineActionFieldSource {
+	refers FunctionLibraryFunction function
+	contains StatemachineOperationParameter first
+	contains StatemachineOperationParameter[] more
+}
+
+class StatemachineStorageRetrieve extends StatemachineActionFieldSource {
+	String key
+	String attribute
+}
+
+class StatemachineStorage extends StatemachineAction {
+	String key
+	String attribute
+	contains StatemachineActionFieldConcatenation content
+}
+
+class StatemachineActionFieldConcatenation extends StatemachineAction {
+	contains StatemachineActionFieldSource first
+	contains StatemachineActionFieldSource[] more  
+}
+
+class StatemachineActionFieldSet extends StatemachineAction {
+	refers StatemachineControlFieldAttribute attribute
+	contains StatemachineActionFieldConcatenation source
+}
+
+class StatemachineActionFieldKeystroke extends StatemachineAction {
+	refers StatemachineControlFieldAttribute attribute
+	String keystroke
+}
+
+class StatemachineActionFieldClear extends StatemachineAction {
+	refers StatemachineControlFieldAttribute attribute
+}
+
+class StatemachineActionFieldGet extends StatemachineActionFieldSource {
+	refers StatemachineControlFieldAttribute attribute
+}
+
+class StatemachineActionFieldRemove extends StatemachineActionFieldSource {
+	refers StatemachineControlFieldAttribute attribute
+}
+
+class StatemachineActionItemVisible extends StatemachineAction {
+	refers StatemachineControlVisibility attribute
+}
+
+class StatemachineActionItemInvisible extends StatemachineAction {
+	refers StatemachineControlVisibility attribute
+}
+
+class StatemachineActionButtonCaption extends StatemachineAction {
+	refers StatemachineControlButtonAttribute attribute
+	contains StatemachineActionFieldConcatenation caption
+}
+
+class StatemachineActionButtonImage extends StatemachineAction {
+	refers StatemachineControlButtonAttribute attribute
+	String image
+}
+
+class StatemachineActionDTOFind extends StatemachineAction {
+	refers StatemachineControlDTOAttribute dto
+	refers LDtoInheritedAttribute attribute
+	contains StatemachineActionFieldConcatenation search
+}
+
+class StatemachineActionScheduler extends StatemachineAction {
+	refers StatemachineControlSchedulerAttribute scheduler
+}
+
+class StatemachineDTOType extends StatemachineLazyResolver{
+	refers LDto attributeType
+}
+
+class StatemachineFieldType extends StatemachineLazyResolver {
+	StatemachineInternalType attributeType
+}
+
+enum StatemachineInternalType {
+	BOOLEAN as 'Boolean'
+	INTEGER as 'Integer'
+	LONG as 'Long'
+	DOUBLE as 'Double'
+	STRING as 'String'
+	DATE as 'Date'
+	SUGGESTTEXT as 'SuggestText'
+}
+
+enum StatemachineControlButtonEventType {
+	KEYBOARD as 'keyboard'
+	TRIGGER as 'trigger'
+	IDENTITY as 'identity'
+}
+
+enum StatemachineEvaluationType {
+	IP_ADDRESS 		as 'getIPAddress'
+	NOW 			as 'getNow'
+	USER_AGENT_INFO as 'getUserAgentInfo'
+	IS_TOUCH_DEVICE as 'isTouchDevice'
+	IS_HTTPS 		as 'isHttps'
+	BROWSER_LOCALE 	as 'getBrowserLocale'
+	USER_NAME		as 'getUserName'
+	USER_PASSWORD	as 'getUserPassword'
+	USER_EMAIL		as 'getUserEmail'
+	USER_POSITION	as 'getUserPosition'
+	USER_PRTSERVICE	as 'getUserPrintService'
+	SCREEN_WIDTH 	as 'getSceenWidth'
+	SCREEN_HEIGHT 	as 'getScreenHeight'
+	TRIGGER			as 'getTrigger'
+}
+
+enum StatemachineUserMessageType {
+	HUMANIZED_MESSAGE		as 'humanized'
+	WARNING_MESSAGE			as 'warning'
+	ERROR_MESSAGE			as 'error'
+	TRAY_NOTIFICATION		as 'tray'
+	ASSISTIVE_NOTIFICATION	as 'assistive'
+}
+
+enum StatemachineLineDisplayCursorType {
+	DISP_CT_NONE		as 'none'     
+	DISP_CT_FIXED    	as 'fixed'
+	DISP_CT_BLOCK    	as 'block'
+	DISP_CT_HALFBLOCK	as 'halfblock'
+	DISP_CT_UNDERLINE	as 'underline'
+	DISP_CT_REVERSE  	as 'reverse'
+	DISP_CT_OTHER    	as 'other'
+	DISP_CT_BLINK		as 'blink'
+}
+
+enum StatemachineLineDisplayMarqueeType {
+	DISP_MT_NONE         as 'none'
+	DISP_MT_UP           as 'up'
+	DISP_MT_DOWN         as 'down'
+	DISP_MT_LEFT         as 'left'
+	DISP_MT_RIGHT        as 'right'
+	DISP_MT_INIT         as 'init'
+}
+
+enum StatemachineLineDisplayMarqueeFormat {
+	DISP_MF_WALK         as 'walk'
+	DISP_MF_PLACE        as 'place'
+}
+
+enum StatemachineLineDisplayTextType {
+	DISP_DT_NORMAL        as  'normal'
+	DISP_DT_BLINK         as  'blink'
+	DISP_DT_REVERSE       as  'reverse'
+	DISP_DT_BLINK_REVERSE as  'blinkreverse'
+}
+
+enum StatemachineLineDisplayScrollTextType {
+	DISP_ST_UP           as 'up'
+	DISP_ST_DOWN         as 'down'
+	DISP_ST_LEFT         as 'left'
+	DISP_ST_RIGHT        as 'right'
+}
+
+enum StatemachinePOSPrinterBarcodeType {
+	PTR_BCS_UPCA           as 'upca'
+	PTR_BCS_UPCE           as 'upcb'
+	PTR_BCS_JAN8           as 'jan8'
+	PTR_BCS_EAN8           as 'ean8'
+	PTR_BCS_JAN13          as 'jan13'
+	PTR_BCS_EAN13          as 'ean13'
+	PTR_BCS_TF             as 'tf'
+	PTR_BCS_ITF            as 'itf'
+	PTR_BCS_Codabar        as 'codeabar'
+	PTR_BCS_Code39         as 'code39'
+	PTR_BCS_Code93         as 'code93'
+	PTR_BCS_Code128        as 'code128'
+	PTR_BCS_UPCA_S         as 'upca_s'
+	PTR_BCS_UPCE_S         as 'upce_s'
+	PTR_BCS_UPCD1          as 'upcd1'
+	PTR_BCS_UPCD2          as 'upcd2'
+	PTR_BCS_UPCD3          as 'upcd3'
+	PTR_BCS_UPCD4          as 'upcd4'
+	PTR_BCS_UPCD5          as 'upcd5'
+	PTR_BCS_EAN8_S         as 'ean8_s'
+	PTR_BCS_EAN13_S        as 'ean13_s'
+	PTR_BCS_EAN128         as 'ean128'
+	PTR_BCS_OCRA           as 'orca'
+	PTR_BCS_OCRB           as 'ocrb'
+	PTR_BCS_Code128_Parsed as 'code128_parsed'
+	PTR_BCS_GS1DATABAR     as 'gs1databar'
+	PTR_BCS_GS1DATABAR_E   as 'gs1databar_e'
+	PTR_BCS_GS1DATABAR_S   as 'gs1databar_s'
+	PTR_BCS_GS1DATABAR_E_S as 'gs1databar_e_s'
+	PTR_BCS_PDF417         as 'pdf417'
+	PTR_BCS_MAXICODE       as 'maxicode'
+	PTR_BCS_DATAMATRIX     as 'datamatrix'
+	PTR_BCS_QRCODE         as 'qrcode'
+	PTR_BCS_UQRCODE        as 'uqrcode'
+	PTR_BCS_AZTEC          as 'aztec'
+	PTR_BCS_UPDF417        as 'updf417'
+}
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.statemachine/notice.html b/org.eclipse.osbp.xtext.statemachine/notice.html
new file mode 100644
index 0000000..c3d34c3
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/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.statemachine/plugin.properties b/org.eclipse.osbp.xtext.statemachine/plugin.properties
new file mode 100644
index 0000000..dfd691a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/plugin.properties
@@ -0,0 +1,14 @@
+# Copyright (c) 2014, 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 
+# 
+#  Based on ideas from Xtext, Xtend, Xcore
+#   
+#  Contributors{  
+#  		Joerg Riegel - Initial implementation 
+#  
+
+pluginName = DataDSL Model
+providerName = www.example.org
diff --git a/org.eclipse.osbp.xtext.statemachine/plugin.xml b/org.eclipse.osbp.xtext.statemachine/plugin.xml
new file mode 100644
index 0000000..b5fb783
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/plugin.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated StatemachineDSL -->
+      <package
+            uri="http://osbp.eclipse.org/xtext/statemachine/StatemachineDSL"
+            class="org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage"
+            genModel="model/StatemachineDSL.xcore"/>
+   </extension>
+
+</plugin>
diff --git a/org.eclipse.osbp.xtext.statemachine/pom.xml b/org.eclipse.osbp.xtext.statemachine/pom.xml
new file mode 100644
index 0000000..c80dc77
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/pom.xml
@@ -0,0 +1,31 @@
+<?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:
+# 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.statemachine</groupId>
+        <artifactId>org.eclipse.osbp.xtext.statemachine.aggregator</artifactId>
+        <version>0.9.0-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+
+    <artifactId>org.eclipse.osbp.xtext.statemachine</artifactId>
+    <packaging>eclipse-plugin</packaging>
+
+    <build>
+        <sourceDirectory>src</sourceDirectory>
+    </build>
+
+	</project>
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/AbstractStatemachineDSLRuntimeModule.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/AbstractStatemachineDSLRuntimeModule.java
new file mode 100644
index 0000000..6d96e75
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/AbstractStatemachineDSLRuntimeModule.java
@@ -0,0 +1,352 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine;
+
+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.statemachine.StatemachineDSLRuntimeModule}
+ */
+ @SuppressWarnings("all")
+public abstract class AbstractStatemachineDSLRuntimeModule extends DefaultRuntimeModule {
+
+	protected Properties properties = null;
+
+	@Override
+	public void configure(Binder binder) {
+		properties = tryBindProperties(binder, "org/eclipse/osbp/xtext/statemachine/StatemachineDSL.properties");
+		super.configure(binder);
+	}
+	
+	public void configureLanguageName(Binder binder) {
+		binder.bind(String.class).annotatedWith(Names.named(Constants.LANGUAGE_NAME)).toInstance("org.eclipse.osbp.xtext.statemachine.StatemachineDSL");
+	}
+	
+	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("statemachine");
+	}
+	
+	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
+	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISemanticSequencer> bindISemanticSequencer() {
+		return org.eclipse.osbp.xtext.statemachine.serializer.StatemachineDSLSemanticSequencer.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
+	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer> bindISyntacticSequencer() {
+		return org.eclipse.osbp.xtext.statemachine.serializer.StatemachineDSLSyntacticSequencer.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.statemachine.parser.antlr.StatemachineDSLParser.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.statemachine.parser.antlr.StatemachineDSLAntlrTokenFileProvider.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.statemachine.parser.antlr.internal.InternalStatemachineDSLLexer.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
+	public com.google.inject.Provider<org.eclipse.osbp.xtext.statemachine.parser.antlr.internal.InternalStatemachineDSLLexer> provideInternalStatemachineDSLLexer() {
+		return org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.xtext.statemachine.parser.antlr.internal.InternalStatemachineDSLLexer.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.statemachine.parser.antlr.internal.InternalStatemachineDSLLexer.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
+	public Class<? extends org.eclipse.xtext.parser.antlr.ITokenDefProvider> bindITokenDefProvider() {
+		return org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
+	public Class<? extends org.eclipse.xtext.parser.antlr.IUnorderedGroupHelper> bindIUnorderedGroupHelper() {
+		return org.eclipse.xtext.parser.antlr.UnorderedGroupHelper.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.validation.ValidatorFragment
+	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.osbp.xtext.statemachine.validation.StatemachineDSLValidator> bindStatemachineDSLValidator() {
+		return org.eclipse.osbp.xtext.statemachine.validation.StatemachineDSLValidator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.scoping.AbstractScopingFragment
+	public void configureIgnoreCaseLinking(com.google.inject.Binder binder) {
+		binder.bindConstant().annotatedWith(org.eclipse.xtext.scoping.IgnoreCaseLinking.class).to(false);
+	}
+
+	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
+	public Class<? extends org.eclipse.xtext.resource.IContainer.Manager> bindIContainer$Manager() {
+		return org.eclipse.xtext.resource.containers.StateBasedContainerManager.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
+	public Class<? extends org.eclipse.xtext.resource.containers.IAllContainersState.Provider> bindIAllContainersState$Provider() {
+		return org.eclipse.xtext.resource.containers.ResourceSetBasedAllContainersStateProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
+	public void configureIResourceDescriptions(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).to(org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
+	public void configureIResourceDescriptionsPersisted(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.formatting.FormatterFragment
+	public Class<? extends org.eclipse.xtext.formatting.IFormatter> bindIFormatter() {
+		return org.eclipse.osbp.xtext.statemachine.formatting.StatemachineDSLFormatter.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public org.eclipse.xtext.common.types.TypesFactory bindTypesFactoryToInstance() {
+		return org.eclipse.xtext.common.types.TypesFactory.eINSTANCE;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.access.IJvmTypeProvider.Factory> bindIJvmTypeProvider$Factory() {
+		return org.eclipse.xtext.common.types.access.ClasspathTypeProviderFactory.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.xtext.AbstractTypeScopeProvider> bindAbstractTypeScopeProvider() {
+		return org.eclipse.xtext.common.types.xtext.ClasspathBasedTypeScopeProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.interpreter.IEvaluationContext> bindIEvaluationContext() {
+		return org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.interpreter.IExpressionInterpreter> bindIExpressionInterpreter() {
+		return org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.naming.IQualifiedNameConverter> bindIQualifiedNameConverter() {
+		return org.eclipse.xtext.xbase.XbaseQualifiedNameConverter.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.naming.IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.conversion.IValueConverterService> bindIValueConverterService() {
+		return org.eclipse.xtext.xbase.conversion.XbaseValueConverterService.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.scoping.IScopeProvider> bindIScopeProvider() {
+		return org.eclipse.xtext.xbase.scoping.batch.IBatchScopeProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public void configureLinkingIScopeProvider(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.scoping.IScopeProvider.class).annotatedWith(org.eclipse.xtext.linking.LinkingScopeProviderBinding.class).to(org.eclipse.xtext.xbase.scoping.batch.IBatchScopeProvider.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public void configureSerializerIScopeProvider(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.scoping.IScopeProvider.class).annotatedWith(org.eclipse.xtext.serializer.tokens.SerializerScopeProviderBinding.class).to(org.eclipse.xtext.xbase.serializer.SerializerScopeProvider.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public void configureIScopeProviderDelegate(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.scoping.IScopeProvider.class).annotatedWith(Names.named(org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(org.eclipse.xtext.xbase.scoping.XbaseImportedNamespaceScopeProvider.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.linking.ILinker> bindILinker() {
+		return org.eclipse.xtext.xbase.linking.XbaseLazyLinker.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.resource.XtextResource> bindXtextResource() {
+		return org.eclipse.xtext.xbase.resource.BatchLinkableResource.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.xtext.xbase.validation.JvmTypeReferencesValidator> bindJvmTypeReferencesValidator() {
+		return org.eclipse.xtext.xbase.validation.JvmTypeReferencesValidator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.featurecalls.IdentifiableSimpleNameProvider> bindIdentifiableSimpleNameProvider() {
+		return org.eclipse.xtext.xbase.featurecalls.IdentifiableSimpleNameProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.resource.IDerivedStateComputer> bindIDerivedStateComputer() {
+		return org.eclipse.xtext.xbase.jvmmodel.JvmModelAssociator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.resource.IResourceDescription.Manager> bindIResourceDescription$Manager() {
+		return org.eclipse.xtext.resource.DerivedStateAwareResourceDescriptionManager.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.generator.IGenerator> bindIGenerator() {
+		return org.eclipse.xtext.xbase.compiler.JvmModelGenerator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public org.eclipse.xtext.xtype.XtypeFactory bindXtypeFactoryToInstance() {
+		return org.eclipse.xtext.xtype.XtypeFactory.eINSTANCE;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.debug.IStratumBreakpointSupport> bindIStratumBreakpointSupport() {
+		return org.eclipse.xtext.xbase.debug.XbaseStratumBreakpointSupport.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.generator.LineSeparatorHarmonizer> bindLineSeparatorHarmonizer() {
+		return org.eclipse.xtext.xbase.compiler.output.TraceAwarePostProcessor.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy> bindIDefaultResourceDescriptionStrategy() {
+		return org.eclipse.xtext.xbase.resource.XbaseResourceDescriptionStrategy.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.validation.SeverityConverter> bindSeverityConverter() {
+		return org.eclipse.xtext.xbase.validation.XbaseSeverityConverter.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.validation.ConfigurableIssueCodesProvider> bindConfigurableIssueCodesProvider() {
+		return org.eclipse.xtext.xbase.validation.XbaseConfigurableIssueCodes.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.resource.EObjectAtOffsetHelper> bindEObjectAtOffsetHelper() {
+		return org.eclipse.xtext.xbase.linking.BrokenConstructorCallAwareEObjectAtOffsetHelper.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.validation.CancelableDiagnostician> bindCancelableDiagnostician() {
+		return org.eclipse.xtext.xbase.validation.XbaseDiagnostician.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.scoping.featurecalls.StaticImplicitMethodsFeatureForTypeProvider.ExtensionClassNameProvider> bindStaticImplicitMethodsFeatureForTypeProvider$ExtensionClassNameProvider() {
+		return org.eclipse.xtext.xbase.scoping.batch.ImplicitlyImportedTypesAdapter.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtend.lib.macro.file.MutableFileSystemSupport> bindMutableFileSystemSupport() {
+		return org.eclipse.xtext.xbase.file.JavaIOFileSystemSupport.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtend.lib.macro.file.FileLocations> bindFileLocations() {
+		return org.eclipse.xtext.xbase.file.FileLocationsImpl.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends com.google.inject.Provider<org.eclipse.xtext.xbase.file.WorkspaceConfig>> provideWorkspaceConfig() {
+		return org.eclipse.xtext.xbase.file.RuntimeWorkspaceConfigProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.typesystem.computation.ITypeComputer> bindITypeComputer() {
+		return org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsTypeComputer.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.scoping.batch.XbaseBatchScopeProvider> bindXbaseBatchScopeProvider() {
+		return org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsBatchScopeProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.linking.ILinkingDiagnosticMessageProvider> bindILinkingDiagnosticMessageProvider() {
+		return org.eclipse.xtext.xbase.annotations.validation.UnresolvedAnnotationTypeAwareMessageProducer.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.resource.ILocationInFileProvider> bindILocationInFileProvider() {
+		return org.eclipse.xtext.xbase.jvmmodel.JvmLocationInFileProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.scoping.IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return org.eclipse.xtext.common.types.xtext.TypesAwareDefaultGlobalScopeProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.validation.FeatureNameValidator> bindFeatureNameValidator() {
+		return org.eclipse.xtext.xbase.validation.LogicalContainerAwareFeatureNameValidator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.typesystem.internal.DefaultBatchTypeResolver> bindDefaultBatchTypeResolver() {
+		return org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareBatchTypeResolver.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver> bindDefaultReentrantTypeResolver() {
+		return org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.validation.IResourceValidator> bindIResourceValidator() {
+		return org.eclipse.xtext.xbase.annotations.validation.DerivedStateAwareResourceValidator.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
+	public Class<? extends org.eclipse.xtext.xbase.jvmmodel.IJvmModelInferrer> bindIJvmModelInferrer() {
+		return org.eclipse.osbp.xtext.statemachine.jvmmodel.StatemachineDSLJvmModelInferrer.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.grammarAccess.GrammarAccessFragment
+	public java.lang.ClassLoader bindClassLoaderToInstance() {
+		return getClass().getClassLoader();
+	}
+
+	// contributed by org.eclipse.xtext.generator.grammarAccess.GrammarAccessFragment
+	public Class<? extends org.eclipse.xtext.IGrammarAccess> bindIGrammarAccess() {
+		return org.eclipse.osbp.xtext.statemachine.services.StatemachineDSLGrammarAccess.class;
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLStandaloneSetupGenerated.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLStandaloneSetupGenerated.java
new file mode 100644
index 0000000..9fdf518
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/StatemachineDSLStandaloneSetupGenerated.java
@@ -0,0 +1,52 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine;
+
+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 StatemachineDSLStandaloneSetupGenerated implements ISetup {
+
+	public Injector createInjectorAndDoEMFRegistration() {
+		org.eclipse.xtext.xbase.annotations.XbaseWithAnnotationsStandaloneSetup.doSetup();
+
+		Injector injector = createInjector();
+		register(injector);
+		return injector;
+	}
+	
+	public Injector createInjector() {
+		return Guice.createInjector(new org.eclipse.osbp.xtext.statemachine.StatemachineDSLRuntimeModule());
+	}
+	
+	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("statemachine", resourceFactory);
+		org.eclipse.xtext.resource.IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("statemachine", serviceProvider);
+		
+
+
+
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/StatemachineDSLAntlrTokenFileProvider.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/StatemachineDSLAntlrTokenFileProvider.java
new file mode 100644
index 0000000..4071e92
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/StatemachineDSLAntlrTokenFileProvider.java
@@ -0,0 +1,25 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.parser.antlr;
+
+import java.io.InputStream;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+
+public class StatemachineDSLAntlrTokenFileProvider implements IAntlrTokenFileProvider {
+	
+	public InputStream getAntlrTokenFile() {
+		ClassLoader classLoader = getClass().getClassLoader();
+    	return classLoader.getResourceAsStream("org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.tokens");
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/StatemachineDSLParser.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/StatemachineDSLParser.java
new file mode 100644
index 0000000..ec51c3a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/StatemachineDSLParser.java
@@ -0,0 +1,49 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.parser.antlr;
+
+import com.google.inject.Inject;
+
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.osbp.xtext.statemachine.services.StatemachineDSLGrammarAccess;
+
+public class StatemachineDSLParser extends org.eclipse.xtext.parser.antlr.AbstractAntlrParser {
+	
+	@Inject
+	private StatemachineDSLGrammarAccess grammarAccess;
+	
+	@Override
+	protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
+		tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
+	}
+	
+	@Override
+	protected org.eclipse.osbp.xtext.statemachine.parser.antlr.internal.InternalStatemachineDSLParser createParser(XtextTokenStream stream) {
+		return new org.eclipse.osbp.xtext.statemachine.parser.antlr.internal.InternalStatemachineDSLParser(stream, getGrammarAccess());
+	}
+	
+	@Override 
+	protected String getDefaultRuleName() {
+		return "StatemachineModel";
+	}
+	
+	public StatemachineDSLGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+	
+	public void setGrammarAccess(StatemachineDSLGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g
new file mode 100644
index 0000000..8df2423
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g
@@ -0,0 +1,10014 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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 InternalStatemachineDSL;
+
+options {
+	superClass=AbstractInternalAntlrParser;
+	
+}
+
+@lexer::header {
+package org.eclipse.osbp.xtext.statemachine.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.statemachine.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.statemachine.services.StatemachineDSLGrammarAccess;
+
+}
+
+@parser::members {
+
+ 	private StatemachineDSLGrammarAccess grammarAccess;
+ 	
+    public InternalStatemachineDSLParser(TokenStream input, StatemachineDSLGrammarAccess grammarAccess) {
+        this(input);
+        this.grammarAccess = grammarAccess;
+        registerRules(grammarAccess.getGrammar());
+    }
+    
+    @Override
+    protected String getFirstRuleName() {
+    	return "StatemachineModel";	
+   	}
+   	
+   	@Override
+   	protected StatemachineDSLGrammarAccess getGrammarAccess() {
+   		return grammarAccess;
+   	}
+}
+
+@rulecatch { 
+    catch (RecognitionException re) { 
+        recover(input,re); 
+        appendSkippedTokens();
+    } 
+}
+
+
+
+
+// Entry rule entryRuleStatemachineModel
+entryRuleStatemachineModel returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineModelRule()); }
+	 iv_ruleStatemachineModel=ruleStatemachineModel 
+	 { $current=$iv_ruleStatemachineModel.current; } 
+	 EOF 
+;
+
+// Rule StatemachineModel
+ruleStatemachineModel returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineModelAccess().getPackagesStatemachinePackageParserRuleCall_0()); 
+	    }
+		lv_packages_0_0=ruleStatemachinePackage		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineModelRule());
+	        }
+       		add(
+       			$current, 
+       			"packages",
+        		lv_packages_0_0, 
+        		"StatemachinePackage");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachinePackage
+entryRuleStatemachinePackage returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachinePackageRule()); }
+	 iv_ruleStatemachinePackage=ruleStatemachinePackage 
+	 { $current=$iv_ruleStatemachinePackage.current; } 
+	 EOF 
+;
+
+// Rule StatemachinePackage
+ruleStatemachinePackage returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachinePackageAccess().getStatemachinePackageAction_0(),
+            $current);
+    }
+)	otherlv_1='package' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachinePackageAccess().getPackageKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachinePackageAccess().getNameQualifiedNameParserRuleCall_2_0()); 
+	    }
+		lv_name_2_0=ruleQualifiedName		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachinePackageRule());
+	        }
+       		set(
+       			$current, 
+       			"name",
+        		lv_name_2_0, 
+        		"QualifiedName");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_3='{' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachinePackageAccess().getLeftCurlyBracketKeyword_3_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachinePackageAccess().getImportsStatemachineImportParserRuleCall_3_1_0()); 
+	    }
+		lv_imports_4_0=ruleStatemachineImport		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachinePackageRule());
+	        }
+       		add(
+       			$current, 
+       			"imports",
+        		lv_imports_4_0, 
+        		"StatemachineImport");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachinePackageAccess().getStatemachinesStatemachineParserRuleCall_3_2_0()); 
+	    }
+		lv_statemachines_5_0=ruleStatemachine		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachinePackageRule());
+	        }
+       		add(
+       			$current, 
+       			"statemachines",
+        		lv_statemachines_5_0, 
+        		"Statemachine");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_6='}' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getStatemachinePackageAccess().getRightCurlyBracketKeyword_3_3());
+    }
+)?)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachine
+entryRuleStatemachine returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineRule()); }
+	 iv_ruleStatemachine=ruleStatemachine 
+	 { $current=$iv_ruleStatemachine.current; } 
+	 EOF 
+;
+
+// Rule Statemachine
+ruleStatemachine returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='statemachine' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineAccess().getStatemachineKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)((
+(
+		lv_description_2_0=	'described by' 
+    {
+        newLeafNode(lv_description_2_0, grammarAccess.getStatemachineAccess().getDescriptionDescribedByKeyword_2_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineRule());
+	        }
+       		setWithLastConsumed($current, "description", true, "described by");
+	    }
+
+)
+)(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineAccess().getDescriptionValueTRANSLATABLESTRINGParserRuleCall_2_1_0()); 
+	    }
+		lv_descriptionValue_3_0=ruleTRANSLATABLESTRING		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineRule());
+	        }
+       		set(
+       			$current, 
+       			"descriptionValue",
+        		lv_descriptionValue_3_0, 
+        		"TRANSLATABLESTRING");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))?(	otherlv_4='functiongroup' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineAccess().getFunctiongroupKeyword_3_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineRule());
+	        }
+        }
+	otherlv_5=RULE_ID
+	{
+		newLeafNode(otherlv_5, grammarAccess.getStatemachineAccess().getFunctionGroupFunctionLibraryStatemachineGroupCrossReference_3_1_0()); 
+	}
+
+)
+))?	otherlv_6='initialState' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getStatemachineAccess().getInitialStateKeyword_4());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineRule());
+	        }
+        }
+	otherlv_7=RULE_ID
+	{
+		newLeafNode(otherlv_7, grammarAccess.getStatemachineAccess().getInitialStateStatemachineStateCrossReference_5_0()); 
+	}
+
+)
+)	otherlv_8='initialEvent' 
+    {
+    	newLeafNode(otherlv_8, grammarAccess.getStatemachineAccess().getInitialEventKeyword_6());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineRule());
+	        }
+        }
+	otherlv_9=RULE_ID
+	{
+		newLeafNode(otherlv_9, grammarAccess.getStatemachineAccess().getInitialEventStatemachineEventCrossReference_7_0()); 
+	}
+
+)
+)(	otherlv_10='events' 
+    {
+    	newLeafNode(otherlv_10, grammarAccess.getStatemachineAccess().getEventsKeyword_8_0());
+    }
+(	otherlv_11='{' 
+    {
+    	newLeafNode(otherlv_11, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineAccess().getEventsStatemachineEventParserRuleCall_8_1_1_0()); 
+	    }
+		lv_events_12_0=ruleStatemachineEvent		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineRule());
+	        }
+       		add(
+       			$current, 
+       			"events",
+        		lv_events_12_0, 
+        		"StatemachineEvent");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_13='}' 
+    {
+    	newLeafNode(otherlv_13, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_2());
+    }
+))(	otherlv_14='controls' 
+    {
+    	newLeafNode(otherlv_14, grammarAccess.getStatemachineAccess().getControlsKeyword_9_0());
+    }
+	otherlv_15='{' 
+    {
+    	newLeafNode(otherlv_15, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_9_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineAccess().getControlsStatemachineControlParserRuleCall_9_2_0()); 
+	    }
+		lv_controls_16_0=ruleStatemachineControl		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineRule());
+	        }
+       		add(
+       			$current, 
+       			"controls",
+        		lv_controls_16_0, 
+        		"StatemachineControl");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_17='}' 
+    {
+    	newLeafNode(otherlv_17, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_9_3());
+    }
+)(	otherlv_18='states' 
+    {
+    	newLeafNode(otherlv_18, grammarAccess.getStatemachineAccess().getStatesKeyword_10_0());
+    }
+	otherlv_19='{' 
+    {
+    	newLeafNode(otherlv_19, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_10_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineAccess().getStatesStatemachineStateParserRuleCall_10_2_0()); 
+	    }
+		lv_states_20_0=ruleStatemachineState		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineRule());
+	        }
+       		add(
+       			$current, 
+       			"states",
+        		lv_states_20_0, 
+        		"StatemachineState");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_21='}' 
+    {
+    	newLeafNode(otherlv_21, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_10_3());
+    }
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineEvent
+entryRuleStatemachineEvent returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineEventRule()); }
+	 iv_ruleStatemachineEvent=ruleStatemachineEvent 
+	 { $current=$iv_ruleStatemachineEvent.current; } 
+	 EOF 
+;
+
+// Rule StatemachineEvent
+ruleStatemachineEvent returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='event' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineEventAccess().getEventKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineEventAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineEventRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineState
+entryRuleStatemachineState returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineStateRule()); }
+	 iv_ruleStatemachineState=ruleStatemachineState 
+	 { $current=$iv_ruleStatemachineState.current; } 
+	 EOF 
+;
+
+// Rule StatemachineState
+ruleStatemachineState returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='state' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineStateAccess().getStateKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineStateAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStateRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_2='{' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_2());
+    }
+(
+
+(
+	{ 
+	  getUnorderedGroupHelper().enter(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+	}
+	(
+		(
+
+			( 
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 0)}?=>(
+					{ 
+	 				  getUnorderedGroupHelper().select(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 0);
+	 				}
+					({true}?=>(	otherlv_4='triggers' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineStateAccess().getTriggersKeyword_3_0_0());
+    }
+	otherlv_5='{' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_3_0_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineStateAccess().getTriggersStatemachineTriggerParserRuleCall_3_0_2_0()); 
+	    }
+		lv_triggers_6_0=ruleStatemachineTrigger		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineStateRule());
+	        }
+       		add(
+       			$current, 
+       			"triggers",
+        		lv_triggers_6_0, 
+        		"StatemachineTrigger");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_7='}' 
+    {
+    	newLeafNode(otherlv_7, grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_3_0_3());
+    }
+))
+					{ 
+	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+	 				}
+ 				)
+			)  |
+
+			( 
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 1)}?=>(
+					{ 
+	 				  getUnorderedGroupHelper().select(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 1);
+	 				}
+					({true}?=>(	otherlv_8='identity' 
+    {
+    	newLeafNode(otherlv_8, grammarAccess.getStatemachineStateAccess().getIdentityKeyword_3_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineStateAccess().getIdentityStatemachineOperationParserRuleCall_3_1_1_0()); 
+	    }
+		lv_identity_9_0=ruleStatemachineOperation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineStateRule());
+	        }
+       		set(
+       			$current, 
+       			"identity",
+        		lv_identity_9_0, 
+        		"StatemachineOperation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))
+					{ 
+	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+	 				}
+ 				)
+			)  |
+
+			( 
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 2)}?=>(
+					{ 
+	 				  getUnorderedGroupHelper().select(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 2);
+	 				}
+					({true}?=>(	otherlv_10='keystroke' 
+    {
+    	newLeafNode(otherlv_10, grammarAccess.getStatemachineStateAccess().getKeystrokeKeyword_3_2_0());
+    }
+	otherlv_11='@' 
+    {
+    	newLeafNode(otherlv_11, grammarAccess.getStatemachineStateAccess().getCommercialAtKeyword_3_2_1());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStateRule());
+	        }
+        }
+	otherlv_12=RULE_ID
+	{
+		newLeafNode(otherlv_12, grammarAccess.getStatemachineStateAccess().getKeystrokeStatemachineControlFieldAttributeCrossReference_3_2_2_0()); 
+	}
+
+)
+)((
+(
+		lv_hasKeyOperation_13_0=	'and' 
+    {
+        newLeafNode(lv_hasKeyOperation_13_0, grammarAccess.getStatemachineStateAccess().getHasKeyOperationAndKeyword_3_2_3_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStateRule());
+	        }
+       		setWithLastConsumed($current, "hasKeyOperation", true, "and");
+	    }
+
+)
+)(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineStateAccess().getKeyOperationStatemachineOperationParserRuleCall_3_2_3_1_0()); 
+	    }
+		lv_keyOperation_14_0=ruleStatemachineOperation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineStateRule());
+	        }
+       		set(
+       			$current, 
+       			"keyOperation",
+        		lv_keyOperation_14_0, 
+        		"StatemachineOperation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))?))
+					{ 
+	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+	 				}
+ 				)
+			)  
+
+		)*	
+	)
+)
+	{ 
+	  getUnorderedGroupHelper().leave(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+	}
+
+)	otherlv_15='}' 
+    {
+    	newLeafNode(otherlv_15, grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_4());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineTrigger
+entryRuleStatemachineTrigger returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineTriggerRule()); }
+	 iv_ruleStatemachineTrigger=ruleStatemachineTrigger 
+	 { $current=$iv_ruleStatemachineTrigger.current; } 
+	 EOF 
+;
+
+// Rule StatemachineTrigger
+ruleStatemachineTrigger returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineTriggerAccess().getStatemachineTriggerAction_0(),
+            $current);
+    }
+)	otherlv_1='trigger' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineTriggerAccess().getTriggerKeyword_1());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineTriggerRule());
+	        }
+        }
+	otherlv_2=RULE_ID
+	{
+		newLeafNode(otherlv_2, grammarAccess.getStatemachineTriggerAccess().getTriggersStatemachineEventCrossReference_2_0()); 
+	}
+
+)
+)*(	otherlv_3='guards' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineTriggerAccess().getGuardsKeyword_3_0());
+    }
+	otherlv_4='{' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_3_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineTriggerAccess().getGuardsStatemachineGuardParserRuleCall_3_2_0()); 
+	    }
+		lv_guards_5_0=ruleStatemachineGuard		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineTriggerRule());
+	        }
+       		add(
+       			$current, 
+       			"guards",
+        		lv_guards_5_0, 
+        		"StatemachineGuard");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_6='}' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_3_3());
+    }
+)?	otherlv_7='actions' 
+    {
+    	newLeafNode(otherlv_7, grammarAccess.getStatemachineTriggerAccess().getActionsKeyword_4());
+    }
+((
+(
+		lv_hasTransition_8_0=	'transition' 
+    {
+        newLeafNode(lv_hasTransition_8_0, grammarAccess.getStatemachineTriggerAccess().getHasTransitionTransitionKeyword_5_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineTriggerRule());
+	        }
+       		setWithLastConsumed($current, "hasTransition", true, "transition");
+	    }
+
+)
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineTriggerRule());
+	        }
+        }
+	otherlv_9=RULE_ID
+	{
+		newLeafNode(otherlv_9, grammarAccess.getStatemachineTriggerAccess().getTransitionStatemachineStateCrossReference_5_1_0()); 
+	}
+
+)
+))?	otherlv_10='{' 
+    {
+    	newLeafNode(otherlv_10, grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_6());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineTriggerAccess().getActionsStatemachineActionParserRuleCall_7_0()); 
+	    }
+		lv_actions_11_0=ruleStatemachineAction		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineTriggerRule());
+	        }
+       		add(
+       			$current, 
+       			"actions",
+        		lv_actions_11_0, 
+        		"StatemachineAction");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_12='}' 
+    {
+    	newLeafNode(otherlv_12, grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_8());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineAction
+entryRuleStatemachineAction returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionRule()); }
+	 iv_ruleStatemachineAction=ruleStatemachineAction 
+	 { $current=$iv_ruleStatemachineAction.current; } 
+	 EOF 
+;
+
+// Rule StatemachineAction
+ruleStatemachineAction returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralBlinkRateParserRuleCall_0()); 
+    }
+    this_StatemachineActionPeripheralBlinkRate_0=ruleStatemachineActionPeripheralBlinkRate
+    { 
+        $current = $this_StatemachineActionPeripheralBlinkRate_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralClearParserRuleCall_1()); 
+    }
+    this_StatemachineActionPeripheralClear_1=ruleStatemachineActionPeripheralClear
+    { 
+        $current = $this_StatemachineActionPeripheralClear_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCreateWindowParserRuleCall_2()); 
+    }
+    this_StatemachineActionPeripheralCreateWindow_2=ruleStatemachineActionPeripheralCreateWindow
+    { 
+        $current = $this_StatemachineActionPeripheralCreateWindow_2.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCursorTypeParserRuleCall_3()); 
+    }
+    this_StatemachineActionPeripheralCursorType_3=ruleStatemachineActionPeripheralCursorType
+    { 
+        $current = $this_StatemachineActionPeripheralCursorType_3.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDestroyWindowParserRuleCall_4()); 
+    }
+    this_StatemachineActionPeripheralDestroyWindow_4=ruleStatemachineActionPeripheralDestroyWindow
+    { 
+        $current = $this_StatemachineActionPeripheralDestroyWindow_4.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5()); 
+    }
+    this_StatemachineActionPeripheralDeviceBrightness_5=ruleStatemachineActionPeripheralDeviceBrightness
+    { 
+        $current = $this_StatemachineActionPeripheralDeviceBrightness_5.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayBitmapParserRuleCall_6()); 
+    }
+    this_StatemachineActionPeripheralDisplayBitmap_6=ruleStatemachineActionPeripheralDisplayBitmap
+    { 
+        $current = $this_StatemachineActionPeripheralDisplayBitmap_6.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextParserRuleCall_7()); 
+    }
+    this_StatemachineActionPeripheralDisplayText_7=ruleStatemachineActionPeripheralDisplayText
+    { 
+        $current = $this_StatemachineActionPeripheralDisplayText_7.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextAtParserRuleCall_8()); 
+    }
+    this_StatemachineActionPeripheralDisplayTextAt_8=ruleStatemachineActionPeripheralDisplayTextAt
+    { 
+        $current = $this_StatemachineActionPeripheralDisplayTextAt_8.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9()); 
+    }
+    this_StatemachineActionPeripheralInterCharacterWait_9=ruleStatemachineActionPeripheralInterCharacterWait
+    { 
+        $current = $this_StatemachineActionPeripheralInterCharacterWait_9.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeFormatParserRuleCall_10()); 
+    }
+    this_StatemachineActionPeripheralMarqueeFormat_10=ruleStatemachineActionPeripheralMarqueeFormat
+    { 
+        $current = $this_StatemachineActionPeripheralMarqueeFormat_10.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11()); 
+    }
+    this_StatemachineActionPeripheralMarqueeRepeatWait_11=ruleStatemachineActionPeripheralMarqueeRepeatWait
+    { 
+        $current = $this_StatemachineActionPeripheralMarqueeRepeatWait_11.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeTypeParserRuleCall_12()); 
+    }
+    this_StatemachineActionPeripheralMarqueeType_12=ruleStatemachineActionPeripheralMarqueeType
+    { 
+        $current = $this_StatemachineActionPeripheralMarqueeType_12.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13()); 
+    }
+    this_StatemachineActionPeripheralMarqueeUnitWait_13=ruleStatemachineActionPeripheralMarqueeUnitWait
+    { 
+        $current = $this_StatemachineActionPeripheralMarqueeUnitWait_13.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralScrollParserRuleCall_14()); 
+    }
+    this_StatemachineActionPeripheralScroll_14=ruleStatemachineActionPeripheralScroll
+    { 
+        $current = $this_StatemachineActionPeripheralScroll_14.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralOpenDrawerParserRuleCall_15()); 
+    }
+    this_StatemachineActionPeripheralOpenDrawer_15=ruleStatemachineActionPeripheralOpenDrawer
+    { 
+        $current = $this_StatemachineActionPeripheralOpenDrawer_15.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBarcodeParserRuleCall_16()); 
+    }
+    this_StatemachineActionPeripheralPrintBarcode_16=ruleStatemachineActionPeripheralPrintBarcode
+    { 
+        $current = $this_StatemachineActionPeripheralPrintBarcode_16.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBitmapParserRuleCall_17()); 
+    }
+    this_StatemachineActionPeripheralPrintBitmap_17=ruleStatemachineActionPeripheralPrintBitmap
+    { 
+        $current = $this_StatemachineActionPeripheralPrintBitmap_17.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintCutParserRuleCall_18()); 
+    }
+    this_StatemachineActionPeripheralPrintCut_18=ruleStatemachineActionPeripheralPrintCut
+    { 
+        $current = $this_StatemachineActionPeripheralPrintCut_18.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintNormalParserRuleCall_19()); 
+    }
+    this_StatemachineActionPeripheralPrintNormal_19=ruleStatemachineActionPeripheralPrintNormal
+    { 
+        $current = $this_StatemachineActionPeripheralPrintNormal_19.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20()); 
+    }
+    this_StatemachineActionPeripheralPrintRegisterBitmap_20=ruleStatemachineActionPeripheralPrintRegisterBitmap
+    { 
+        $current = $this_StatemachineActionPeripheralPrintRegisterBitmap_20.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTOpenParserRuleCall_21()); 
+    }
+    this_StatemachineActionPeripheralPTOpen_21=ruleStatemachineActionPeripheralPTOpen
+    { 
+        $current = $this_StatemachineActionPeripheralPTOpen_21.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTCloseParserRuleCall_22()); 
+    }
+    this_StatemachineActionPeripheralPTClose_22=ruleStatemachineActionPeripheralPTClose
+    { 
+        $current = $this_StatemachineActionPeripheralPTClose_22.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23()); 
+    }
+    this_StatemachineActionPeripheralPTAcknowledge_23=ruleStatemachineActionPeripheralPTAcknowledge
+    { 
+        $current = $this_StatemachineActionPeripheralPTAcknowledge_23.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTReversalParserRuleCall_24()); 
+    }
+    this_StatemachineActionPeripheralPTReversal_24=ruleStatemachineActionPeripheralPTReversal
+    { 
+        $current = $this_StatemachineActionPeripheralPTReversal_24.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTRegistrationParserRuleCall_25()); 
+    }
+    this_StatemachineActionPeripheralPTRegistration_25=ruleStatemachineActionPeripheralPTRegistration
+    { 
+        $current = $this_StatemachineActionPeripheralPTRegistration_25.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAuthorizationParserRuleCall_26()); 
+    }
+    this_StatemachineActionPeripheralPTAuthorization_26=ruleStatemachineActionPeripheralPTAuthorization
+    { 
+        $current = $this_StatemachineActionPeripheralPTAuthorization_26.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintReportParserRuleCall_27()); 
+    }
+    this_StatemachineActionPeripheralPrintReport_27=ruleStatemachineActionPeripheralPrintReport
+    { 
+        $current = $this_StatemachineActionPeripheralPrintReport_27.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldSetParserRuleCall_28()); 
+    }
+    this_StatemachineActionFieldSet_28=ruleStatemachineActionFieldSet
+    { 
+        $current = $this_StatemachineActionFieldSet_28.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldRemoveParserRuleCall_29()); 
+    }
+    this_StatemachineActionFieldRemove_29=ruleStatemachineActionFieldRemove
+    { 
+        $current = $this_StatemachineActionFieldRemove_29.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemVisibleParserRuleCall_30()); 
+    }
+    this_StatemachineActionItemVisible_30=ruleStatemachineActionItemVisible
+    { 
+        $current = $this_StatemachineActionItemVisible_30.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemInvisibleParserRuleCall_31()); 
+    }
+    this_StatemachineActionItemInvisible_31=ruleStatemachineActionItemInvisible
+    { 
+        $current = $this_StatemachineActionItemInvisible_31.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldClearParserRuleCall_32()); 
+    }
+    this_StatemachineActionFieldClear_32=ruleStatemachineActionFieldClear
+    { 
+        $current = $this_StatemachineActionFieldClear_32.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonCaptionParserRuleCall_33()); 
+    }
+    this_StatemachineActionButtonCaption_33=ruleStatemachineActionButtonCaption
+    { 
+        $current = $this_StatemachineActionButtonCaption_33.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonImageParserRuleCall_34()); 
+    }
+    this_StatemachineActionButtonImage_34=ruleStatemachineActionButtonImage
+    { 
+        $current = $this_StatemachineActionButtonImage_34.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionDTOFindParserRuleCall_35()); 
+    }
+    this_StatemachineActionDTOFind_35=ruleStatemachineActionDTOFind
+    { 
+        $current = $this_StatemachineActionDTOFind_35.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineStorageParserRuleCall_36()); 
+    }
+    this_StatemachineStorage_36=ruleStatemachineStorage
+    { 
+        $current = $this_StatemachineStorage_36.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionSchedulerParserRuleCall_37()); 
+    }
+    this_StatemachineActionScheduler_37=ruleStatemachineActionScheduler
+    { 
+        $current = $this_StatemachineActionScheduler_37.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineOperationParserRuleCall_38()); 
+    }
+    this_StatemachineOperation_38=ruleStatemachineOperation
+    { 
+        $current = $this_StatemachineOperation_38.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionConditionalTransitionParserRuleCall_39()); 
+    }
+    this_StatemachineActionConditionalTransition_39=ruleStatemachineActionConditionalTransition
+    { 
+        $current = $this_StatemachineActionConditionalTransition_39.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralBlinkRate
+entryRuleStatemachineActionPeripheralBlinkRate returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralBlinkRateRule()); }
+	 iv_ruleStatemachineActionPeripheralBlinkRate=ruleStatemachineActionPeripheralBlinkRate 
+	 { $current=$iv_ruleStatemachineActionPeripheralBlinkRate.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralBlinkRate
+ruleStatemachineActionPeripheralBlinkRate returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='blinkRate' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateKeyword_0());
+    }
+(
+(
+		lv_blinkRate_1_0=RULE_INT
+		{
+			newLeafNode(lv_blinkRate_1_0, grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateINTTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralBlinkRateRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"blinkRate",
+        		lv_blinkRate_1_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralBlinkRateRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralClear
+entryRuleStatemachineActionPeripheralClear returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralClearRule()); }
+	 iv_ruleStatemachineActionPeripheralClear=ruleStatemachineActionPeripheralClear 
+	 { $current=$iv_ruleStatemachineActionPeripheralClear.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralClear
+ruleStatemachineActionPeripheralClear returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='clearDevice' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralClearAccess().getClearDeviceKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralClearRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralClearAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralCreateWindow
+entryRuleStatemachineActionPeripheralCreateWindow returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralCreateWindowRule()); }
+	 iv_ruleStatemachineActionPeripheralCreateWindow=ruleStatemachineActionPeripheralCreateWindow 
+	 { $current=$iv_ruleStatemachineActionPeripheralCreateWindow.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralCreateWindow
+ruleStatemachineActionPeripheralCreateWindow returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='createWindow' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getCreateWindowKeyword_0());
+    }
+	otherlv_1='row' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getRowKeyword_1());
+    }
+(
+(
+		lv_viewportRow_2_0=RULE_INT
+		{
+			newLeafNode(lv_viewportRow_2_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportRowINTTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"viewportRow",
+        		lv_viewportRow_2_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_3='column' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getColumnKeyword_3());
+    }
+(
+(
+		lv_viewportColumn_4_0=RULE_INT
+		{
+			newLeafNode(lv_viewportColumn_4_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportColumnINTTerminalRuleCall_4_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"viewportColumn",
+        		lv_viewportColumn_4_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_5='height' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getHeightKeyword_5());
+    }
+(
+(
+		lv_viewportHeight_6_0=RULE_INT
+		{
+			newLeafNode(lv_viewportHeight_6_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportHeightINTTerminalRuleCall_6_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"viewportHeight",
+        		lv_viewportHeight_6_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_7='width' 
+    {
+    	newLeafNode(otherlv_7, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWidthKeyword_7());
+    }
+(
+(
+		lv_viewportWidth_8_0=RULE_INT
+		{
+			newLeafNode(lv_viewportWidth_8_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportWidthINTTerminalRuleCall_8_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"viewportWidth",
+        		lv_viewportWidth_8_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_9='windowHeight' 
+    {
+    	newLeafNode(otherlv_9, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowHeightKeyword_9());
+    }
+(
+(
+		lv_windowHeight_10_0=RULE_INT
+		{
+			newLeafNode(lv_windowHeight_10_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowHeightINTTerminalRuleCall_10_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"windowHeight",
+        		lv_windowHeight_10_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_11='windowWidth' 
+    {
+    	newLeafNode(otherlv_11, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowWidthKeyword_11());
+    }
+(
+(
+		lv_windowWidth_12_0=RULE_INT
+		{
+			newLeafNode(lv_windowWidth_12_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowWidthINTTerminalRuleCall_12_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"windowWidth",
+        		lv_windowWidth_12_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_13='@' 
+    {
+    	newLeafNode(otherlv_13, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getCommercialAtKeyword_13());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+	        }
+        }
+	otherlv_14=RULE_ID
+	{
+		newLeafNode(otherlv_14, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_14_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralCursorType
+entryRuleStatemachineActionPeripheralCursorType returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralCursorTypeRule()); }
+	 iv_ruleStatemachineActionPeripheralCursorType=ruleStatemachineActionPeripheralCursorType 
+	 { $current=$iv_ruleStatemachineActionPeripheralCursorType.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralCursorType
+ruleStatemachineActionPeripheralCursorType returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='cursorType' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getCursorTypeKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getCursorTypeStatemachineLineDisplayCursorTypeEnumRuleCall_1_0()); 
+	    }
+		lv_cursorType_1_0=ruleStatemachineLineDisplayCursorType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralCursorTypeRule());
+	        }
+       		set(
+       			$current, 
+       			"cursorType",
+        		lv_cursorType_1_0, 
+        		"StatemachineLineDisplayCursorType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralCursorTypeRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDestroyWindow
+entryRuleStatemachineActionPeripheralDestroyWindow returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralDestroyWindowRule()); }
+	 iv_ruleStatemachineActionPeripheralDestroyWindow=ruleStatemachineActionPeripheralDestroyWindow 
+	 { $current=$iv_ruleStatemachineActionPeripheralDestroyWindow.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDestroyWindow
+ruleStatemachineActionPeripheralDestroyWindow returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='destroyWindow' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getDestroyWindowKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDestroyWindowRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDeviceBrightness
+entryRuleStatemachineActionPeripheralDeviceBrightness returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule()); }
+	 iv_ruleStatemachineActionPeripheralDeviceBrightness=ruleStatemachineActionPeripheralDeviceBrightness 
+	 { $current=$iv_ruleStatemachineActionPeripheralDeviceBrightness.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDeviceBrightness
+ruleStatemachineActionPeripheralDeviceBrightness returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='deviceBrightness' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getDeviceBrightnessKeyword_0());
+    }
+(
+(
+		lv_brightness_1_0=RULE_INT
+		{
+			newLeafNode(lv_brightness_1_0, grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getBrightnessINTTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"brightness",
+        		lv_brightness_1_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDisplayBitmap
+entryRuleStatemachineActionPeripheralDisplayBitmap returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule()); }
+	 iv_ruleStatemachineActionPeripheralDisplayBitmap=ruleStatemachineActionPeripheralDisplayBitmap 
+	 { $current=$iv_ruleStatemachineActionPeripheralDisplayBitmap.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDisplayBitmap
+ruleStatemachineActionPeripheralDisplayBitmap returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='displayBitmap' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getDisplayBitmapKeyword_0());
+    }
+	otherlv_1='id' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getIdKeyword_1());
+    }
+(
+(
+		lv_bitmapId_2_0=RULE_INT
+		{
+			newLeafNode(lv_bitmapId_2_0, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"bitmapId",
+        		lv_bitmapId_2_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_3='@' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getCommercialAtKeyword_3());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule());
+	        }
+        }
+	otherlv_4=RULE_ID
+	{
+		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDisplayText
+entryRuleStatemachineActionPeripheralDisplayText returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextRule()); }
+	 iv_ruleStatemachineActionPeripheralDisplayText=ruleStatemachineActionPeripheralDisplayText 
+	 { $current=$iv_ruleStatemachineActionPeripheralDisplayText.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDisplayText
+ruleStatemachineActionPeripheralDisplayText returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='displayText' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getDisplayTextKeyword_0());
+    }
+	otherlv_1='text' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getTextKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_text_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralDisplayTextRule());
+	        }
+       		set(
+       			$current, 
+       			"text",
+        		lv_text_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)((
+(
+		lv_hasType_3_0=	'type' 
+    {
+        newLeafNode(lv_hasType_3_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getHasTypeTypeKeyword_3_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextRule());
+	        }
+       		setWithLastConsumed($current, "hasType", true, "type");
+	    }
+
+)
+)(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_3_1_0()); 
+	    }
+		lv_textType_4_0=ruleStatemachineLineDisplayTextType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralDisplayTextRule());
+	        }
+       		set(
+       			$current, 
+       			"textType",
+        		lv_textType_4_0, 
+        		"StatemachineLineDisplayTextType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))?	otherlv_5='@' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getCommercialAtKeyword_4());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextRule());
+	        }
+        }
+	otherlv_6=RULE_ID
+	{
+		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_5_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralDisplayTextAt
+entryRuleStatemachineActionPeripheralDisplayTextAt returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule()); }
+	 iv_ruleStatemachineActionPeripheralDisplayTextAt=ruleStatemachineActionPeripheralDisplayTextAt 
+	 { $current=$iv_ruleStatemachineActionPeripheralDisplayTextAt.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralDisplayTextAt
+ruleStatemachineActionPeripheralDisplayTextAt returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='displayTextAt' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getDisplayTextAtKeyword_0());
+    }
+	otherlv_1='text' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getTextKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_text_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+	        }
+       		set(
+       			$current, 
+       			"text",
+        		lv_text_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_3='row' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getRowKeyword_3());
+    }
+(
+(
+		lv_row_4_0=RULE_INT
+		{
+			newLeafNode(lv_row_4_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getRowINTTerminalRuleCall_4_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"row",
+        		lv_row_4_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_5='column' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getColumnKeyword_5());
+    }
+(
+(
+		lv_column_6_0=RULE_INT
+		{
+			newLeafNode(lv_column_6_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getColumnINTTerminalRuleCall_6_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"column",
+        		lv_column_6_0, 
+        		"INT");
+	    }
+
+)
+)((
+(
+		lv_hasType_7_0=	'type' 
+    {
+        newLeafNode(lv_hasType_7_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getHasTypeTypeKeyword_7_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+	        }
+       		setWithLastConsumed($current, "hasType", true, "type");
+	    }
+
+)
+)(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_7_1_0()); 
+	    }
+		lv_textType_8_0=ruleStatemachineLineDisplayTextType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+	        }
+       		set(
+       			$current, 
+       			"textType",
+        		lv_textType_8_0, 
+        		"StatemachineLineDisplayTextType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))?	otherlv_9='@' 
+    {
+    	newLeafNode(otherlv_9, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getCommercialAtKeyword_8());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+	        }
+        }
+	otherlv_10=RULE_ID
+	{
+		newLeafNode(otherlv_10, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_9_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralInterCharacterWait
+entryRuleStatemachineActionPeripheralInterCharacterWait returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule()); }
+	 iv_ruleStatemachineActionPeripheralInterCharacterWait=ruleStatemachineActionPeripheralInterCharacterWait 
+	 { $current=$iv_ruleStatemachineActionPeripheralInterCharacterWait.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralInterCharacterWait
+ruleStatemachineActionPeripheralInterCharacterWait returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='interCharacterWait' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getInterCharacterWaitKeyword_0());
+    }
+(
+(
+		lv_wait_1_0=RULE_INT
+		{
+			newLeafNode(lv_wait_1_0, grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getWaitINTTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"wait",
+        		lv_wait_1_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralMarqueeFormat
+entryRuleStatemachineActionPeripheralMarqueeFormat returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule()); }
+	 iv_ruleStatemachineActionPeripheralMarqueeFormat=ruleStatemachineActionPeripheralMarqueeFormat 
+	 { $current=$iv_ruleStatemachineActionPeripheralMarqueeFormat.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralMarqueeFormat
+ruleStatemachineActionPeripheralMarqueeFormat returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='marqueeFormat' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getMarqueeFormatKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getFormatStatemachineLineDisplayMarqueeFormatEnumRuleCall_1_0()); 
+	    }
+		lv_format_1_0=ruleStatemachineLineDisplayMarqueeFormat		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule());
+	        }
+       		set(
+       			$current, 
+       			"format",
+        		lv_format_1_0, 
+        		"StatemachineLineDisplayMarqueeFormat");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralMarqueeRepeatWait
+entryRuleStatemachineActionPeripheralMarqueeRepeatWait returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule()); }
+	 iv_ruleStatemachineActionPeripheralMarqueeRepeatWait=ruleStatemachineActionPeripheralMarqueeRepeatWait 
+	 { $current=$iv_ruleStatemachineActionPeripheralMarqueeRepeatWait.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralMarqueeRepeatWait
+ruleStatemachineActionPeripheralMarqueeRepeatWait returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='marqueeRepeatWait' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getMarqueeRepeatWaitKeyword_0());
+    }
+(
+(
+		lv_wait_1_0=RULE_INT
+		{
+			newLeafNode(lv_wait_1_0, grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getWaitINTTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"wait",
+        		lv_wait_1_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralMarqueeType
+entryRuleStatemachineActionPeripheralMarqueeType returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule()); }
+	 iv_ruleStatemachineActionPeripheralMarqueeType=ruleStatemachineActionPeripheralMarqueeType 
+	 { $current=$iv_ruleStatemachineActionPeripheralMarqueeType.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralMarqueeType
+ruleStatemachineActionPeripheralMarqueeType returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='marqueeType' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getMarqueeTypeKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getMarqueeTypeStatemachineLineDisplayMarqueeTypeEnumRuleCall_1_0()); 
+	    }
+		lv_marqueeType_1_0=ruleStatemachineLineDisplayMarqueeType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule());
+	        }
+       		set(
+       			$current, 
+       			"marqueeType",
+        		lv_marqueeType_1_0, 
+        		"StatemachineLineDisplayMarqueeType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralMarqueeUnitWait
+entryRuleStatemachineActionPeripheralMarqueeUnitWait returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule()); }
+	 iv_ruleStatemachineActionPeripheralMarqueeUnitWait=ruleStatemachineActionPeripheralMarqueeUnitWait 
+	 { $current=$iv_ruleStatemachineActionPeripheralMarqueeUnitWait.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralMarqueeUnitWait
+ruleStatemachineActionPeripheralMarqueeUnitWait returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='marqueeUnitWait' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getMarqueeUnitWaitKeyword_0());
+    }
+(
+(
+		lv_wait_1_0=RULE_INT
+		{
+			newLeafNode(lv_wait_1_0, grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getWaitINTTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"wait",
+        		lv_wait_1_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralScroll
+entryRuleStatemachineActionPeripheralScroll returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralScrollRule()); }
+	 iv_ruleStatemachineActionPeripheralScroll=ruleStatemachineActionPeripheralScroll 
+	 { $current=$iv_ruleStatemachineActionPeripheralScroll.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralScroll
+ruleStatemachineActionPeripheralScroll returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='scroll' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralScrollAccess().getScrollKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralScrollAccess().getDirectionStatemachineLineDisplayScrollTextTypeEnumRuleCall_1_0()); 
+	    }
+		lv_direction_1_0=ruleStatemachineLineDisplayScrollTextType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralScrollRule());
+	        }
+       		set(
+       			$current, 
+       			"direction",
+        		lv_direction_1_0, 
+        		"StatemachineLineDisplayScrollTextType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(
+(
+		lv_units_2_0=RULE_INT
+		{
+			newLeafNode(lv_units_2_0, grammarAccess.getStatemachineActionPeripheralScrollAccess().getUnitsINTTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralScrollRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"units",
+        		lv_units_2_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_3='@' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralScrollAccess().getCommercialAtKeyword_3());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralScrollRule());
+	        }
+        }
+	otherlv_4=RULE_ID
+	{
+		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralScrollAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralOpenDrawer
+entryRuleStatemachineActionPeripheralOpenDrawer returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralOpenDrawerRule()); }
+	 iv_ruleStatemachineActionPeripheralOpenDrawer=ruleStatemachineActionPeripheralOpenDrawer 
+	 { $current=$iv_ruleStatemachineActionPeripheralOpenDrawer.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralOpenDrawer
+ruleStatemachineActionPeripheralOpenDrawer returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='openDrawer' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getOpenDrawerKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralOpenDrawerRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getDeviceStatemachinePeripheralDeviceCashDrawerCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintBarcode
+entryRuleStatemachineActionPeripheralPrintBarcode returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule()); }
+	 iv_ruleStatemachineActionPeripheralPrintBarcode=ruleStatemachineActionPeripheralPrintBarcode 
+	 { $current=$iv_ruleStatemachineActionPeripheralPrintBarcode.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintBarcode
+ruleStatemachineActionPeripheralPrintBarcode returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='printBarcode' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getPrintBarcodeKeyword_0());
+    }
+	otherlv_1='data' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDataKeyword_1());
+    }
+(
+(
+		lv_data_2_0=RULE_STRING
+		{
+			newLeafNode(lv_data_2_0, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDataSTRINGTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"data",
+        		lv_data_2_0, 
+        		"STRING");
+	    }
+
+)
+)	otherlv_3='barcodeType' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getBarcodeTypeKeyword_3());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getBarcodeTypeStatemachinePOSPrinterBarcodeTypeEnumRuleCall_4_0()); 
+	    }
+		lv_barcodeType_4_0=ruleStatemachinePOSPrinterBarcodeType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule());
+	        }
+       		set(
+       			$current, 
+       			"barcodeType",
+        		lv_barcodeType_4_0, 
+        		"StatemachinePOSPrinterBarcodeType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_5='@' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getCommercialAtKeyword_5());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule());
+	        }
+        }
+	otherlv_6=RULE_ID
+	{
+		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintBitmap
+entryRuleStatemachineActionPeripheralPrintBitmap returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule()); }
+	 iv_ruleStatemachineActionPeripheralPrintBitmap=ruleStatemachineActionPeripheralPrintBitmap 
+	 { $current=$iv_ruleStatemachineActionPeripheralPrintBitmap.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintBitmap
+ruleStatemachineActionPeripheralPrintBitmap returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='printBitmap' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getPrintBitmapKeyword_0());
+    }
+	otherlv_1='id' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getIdKeyword_1());
+    }
+(
+(
+		lv_bitmapId_2_0=RULE_INT
+		{
+			newLeafNode(lv_bitmapId_2_0, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"bitmapId",
+        		lv_bitmapId_2_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_3='@' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getCommercialAtKeyword_3());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule());
+	        }
+        }
+	otherlv_4=RULE_ID
+	{
+		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintCut
+entryRuleStatemachineActionPeripheralPrintCut returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintCutRule()); }
+	 iv_ruleStatemachineActionPeripheralPrintCut=ruleStatemachineActionPeripheralPrintCut 
+	 { $current=$iv_ruleStatemachineActionPeripheralPrintCut.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintCut
+ruleStatemachineActionPeripheralPrintCut returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='printCut' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getPrintCutKeyword_0());
+    }
+	otherlv_1='text' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getTextKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_text_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPrintCutRule());
+	        }
+       		set(
+       			$current, 
+       			"text",
+        		lv_text_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_3='@' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getCommercialAtKeyword_3());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintCutRule());
+	        }
+        }
+	otherlv_4=RULE_ID
+	{
+		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintNormal
+entryRuleStatemachineActionPeripheralPrintNormal returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintNormalRule()); }
+	 iv_ruleStatemachineActionPeripheralPrintNormal=ruleStatemachineActionPeripheralPrintNormal 
+	 { $current=$iv_ruleStatemachineActionPeripheralPrintNormal.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintNormal
+ruleStatemachineActionPeripheralPrintNormal returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='printNormal' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getPrintNormalKeyword_0());
+    }
+	otherlv_1='text' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getTextKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_text_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPrintNormalRule());
+	        }
+       		set(
+       			$current, 
+       			"text",
+        		lv_text_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_3='@' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getCommercialAtKeyword_3());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintNormalRule());
+	        }
+        }
+	otherlv_4=RULE_ID
+	{
+		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintRegisterBitmap
+entryRuleStatemachineActionPeripheralPrintRegisterBitmap returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule()); }
+	 iv_ruleStatemachineActionPeripheralPrintRegisterBitmap=ruleStatemachineActionPeripheralPrintRegisterBitmap 
+	 { $current=$iv_ruleStatemachineActionPeripheralPrintRegisterBitmap.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintRegisterBitmap
+ruleStatemachineActionPeripheralPrintRegisterBitmap returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='registerBitmap' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getRegisterBitmapKeyword_0());
+    }
+	otherlv_1='id' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getIdKeyword_1());
+    }
+(
+(
+		lv_bitmapId_2_0=RULE_INT
+		{
+			newLeafNode(lv_bitmapId_2_0, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"bitmapId",
+        		lv_bitmapId_2_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_3='name' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getNameKeyword_3());
+    }
+(
+(
+		lv_name_4_0=RULE_STRING
+		{
+			newLeafNode(lv_name_4_0, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getNameSTRINGTerminalRuleCall_4_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_4_0, 
+        		"STRING");
+	    }
+
+)
+)	otherlv_5='@' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getCommercialAtKeyword_5());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule());
+	        }
+        }
+	otherlv_6=RULE_ID
+	{
+		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTOpen
+entryRuleStatemachineActionPeripheralPTOpen returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTOpenRule()); }
+	 iv_ruleStatemachineActionPeripheralPTOpen=ruleStatemachineActionPeripheralPTOpen 
+	 { $current=$iv_ruleStatemachineActionPeripheralPTOpen.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTOpen
+ruleStatemachineActionPeripheralPTOpen returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='paymentOpen' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getPaymentOpenKeyword_0());
+    }
+	otherlv_1='host' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getHostKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getHostStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_host_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTOpenRule());
+	        }
+       		set(
+       			$current, 
+       			"host",
+        		lv_host_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_3='port' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getPortKeyword_3());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getPortStatemachineActionFieldConcatenationParserRuleCall_4_0()); 
+	    }
+		lv_port_4_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTOpenRule());
+	        }
+       		set(
+       			$current, 
+       			"port",
+        		lv_port_4_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_5='@' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getCommercialAtKeyword_5());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTOpenRule());
+	        }
+        }
+	otherlv_6=RULE_ID
+	{
+		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_6_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTClose
+entryRuleStatemachineActionPeripheralPTClose returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTCloseRule()); }
+	 iv_ruleStatemachineActionPeripheralPTClose=ruleStatemachineActionPeripheralPTClose 
+	 { $current=$iv_ruleStatemachineActionPeripheralPTClose.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTClose
+ruleStatemachineActionPeripheralPTClose returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='paymentClose' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getPaymentCloseKeyword_0());
+    }
+	otherlv_1='@' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getCommercialAtKeyword_1());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTCloseRule());
+	        }
+        }
+	otherlv_2=RULE_ID
+	{
+		newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_2_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTAcknowledge
+entryRuleStatemachineActionPeripheralPTAcknowledge returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule()); }
+	 iv_ruleStatemachineActionPeripheralPTAcknowledge=ruleStatemachineActionPeripheralPTAcknowledge 
+	 { $current=$iv_ruleStatemachineActionPeripheralPTAcknowledge.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTAcknowledge
+ruleStatemachineActionPeripheralPTAcknowledge returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='paymentAcknowledge' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getPaymentAcknowledgeKeyword_0());
+    }
+	otherlv_1='@' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getCommercialAtKeyword_1());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule());
+	        }
+        }
+	otherlv_2=RULE_ID
+	{
+		newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_2_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTReversal
+entryRuleStatemachineActionPeripheralPTReversal returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTReversalRule()); }
+	 iv_ruleStatemachineActionPeripheralPTReversal=ruleStatemachineActionPeripheralPTReversal 
+	 { $current=$iv_ruleStatemachineActionPeripheralPTReversal.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTReversal
+ruleStatemachineActionPeripheralPTReversal returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='paymentReversal' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getPaymentReversalKeyword_0());
+    }
+	otherlv_1='withPassword' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getWithPasswordKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_password_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTReversalRule());
+	        }
+       		set(
+       			$current, 
+       			"password",
+        		lv_password_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_3='ofReceipt' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getOfReceiptKeyword_3());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getReceiptStatemachineActionFieldConcatenationParserRuleCall_4_0()); 
+	    }
+		lv_receipt_4_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTReversalRule());
+	        }
+       		set(
+       			$current, 
+       			"receipt",
+        		lv_receipt_4_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_5='@' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getCommercialAtKeyword_5());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTReversalRule());
+	        }
+        }
+	otherlv_6=RULE_ID
+	{
+		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_6_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTRegistration
+entryRuleStatemachineActionPeripheralPTRegistration returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule()); }
+	 iv_ruleStatemachineActionPeripheralPTRegistration=ruleStatemachineActionPeripheralPTRegistration 
+	 { $current=$iv_ruleStatemachineActionPeripheralPTRegistration.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTRegistration
+ruleStatemachineActionPeripheralPTRegistration returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='paymentRegistration' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getPaymentRegistrationKeyword_0());
+    }
+	otherlv_1='withPassword' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getWithPasswordKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_password_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule());
+	        }
+       		set(
+       			$current, 
+       			"password",
+        		lv_password_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_3='configuration' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getConfigurationKeyword_3());
+    }
+(
+(
+		lv_configuration_4_0=RULE_STRING
+		{
+			newLeafNode(lv_configuration_4_0, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getConfigurationSTRINGTerminalRuleCall_4_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"configuration",
+        		lv_configuration_4_0, 
+        		"STRING");
+	    }
+
+)
+)	otherlv_5='@' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getCommercialAtKeyword_5());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule());
+	        }
+        }
+	otherlv_6=RULE_ID
+	{
+		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_6_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTAuthorization
+entryRuleStatemachineActionPeripheralPTAuthorization returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule()); }
+	 iv_ruleStatemachineActionPeripheralPTAuthorization=ruleStatemachineActionPeripheralPTAuthorization 
+	 { $current=$iv_ruleStatemachineActionPeripheralPTAuthorization.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTAuthorization
+ruleStatemachineActionPeripheralPTAuthorization returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='paymentAuthorization' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getPaymentAuthorizationKeyword_0());
+    }
+	otherlv_1='ofAmount' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getOfAmountKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getAmountStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_amount_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule());
+	        }
+       		set(
+       			$current, 
+       			"amount",
+        		lv_amount_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_3='@' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getCommercialAtKeyword_3());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule());
+	        }
+        }
+	otherlv_4=RULE_ID
+	{
+		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_4_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPTResponse
+entryRuleStatemachineActionPeripheralPTResponse returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTResponseRule()); }
+	 iv_ruleStatemachineActionPeripheralPTResponse=ruleStatemachineActionPeripheralPTResponse 
+	 { $current=$iv_ruleStatemachineActionPeripheralPTResponse.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPTResponse
+ruleStatemachineActionPeripheralPTResponse returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='paymentResponse' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getPaymentResponseKeyword_0());
+    }
+	otherlv_1='from' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getFromKeyword_1());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTResponseRule());
+	        }
+        }
+	otherlv_2=RULE_ID
+	{
+		newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_2_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionPeripheralPrintReport
+entryRuleStatemachineActionPeripheralPrintReport returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintReportRule()); }
+	 iv_ruleStatemachineActionPeripheralPrintReport=ruleStatemachineActionPeripheralPrintReport 
+	 { $current=$iv_ruleStatemachineActionPeripheralPrintReport.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionPeripheralPrintReport
+ruleStatemachineActionPeripheralPrintReport returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='printReport' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getPrintReportKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintReportRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getReportReportCrossReference_1_0()); 
+	}
+
+)
+)((
+(
+		lv_hasFilter_2_0=	'from' 
+    {
+        newLeafNode(lv_hasFilter_2_0, grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getHasFilterFromKeyword_2_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintReportRule());
+	        }
+       		setWithLastConsumed($current, "hasFilter", true, "from");
+	    }
+
+)
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintReportRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getKeyStatemachineStorageCrossReference_2_1_0()); 
+	}
+
+)
+))?)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSource
+entryRuleStatemachineActionFieldSource returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceRule()); }
+	 iv_ruleStatemachineActionFieldSource=ruleStatemachineActionFieldSource 
+	 { $current=$iv_ruleStatemachineActionFieldSource.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSource
+ruleStatemachineActionFieldSource returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceStringParserRuleCall_0()); 
+    }
+    this_StatemachineActionFieldSourceString_0=ruleStatemachineActionFieldSourceString
+    { 
+        $current = $this_StatemachineActionFieldSourceString_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceNumberParserRuleCall_1()); 
+    }
+    this_StatemachineActionFieldSourceNumber_1=ruleStatemachineActionFieldSourceNumber
+    { 
+        $current = $this_StatemachineActionFieldSourceNumber_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEvaluateParserRuleCall_2()); 
+    }
+    this_StatemachineActionFieldSourceEvaluate_2=ruleStatemachineActionFieldSourceEvaluate
+    { 
+        $current = $this_StatemachineActionFieldSourceEvaluate_2.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceTranslateParserRuleCall_3()); 
+    }
+    this_StatemachineActionFieldSourceTranslate_3=ruleStatemachineActionFieldSourceTranslate
+    { 
+        $current = $this_StatemachineActionFieldSourceTranslate_3.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldGetParserRuleCall_4()); 
+    }
+    this_StatemachineActionFieldGet_4=ruleStatemachineActionFieldGet
+    { 
+        $current = $this_StatemachineActionFieldGet_4.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineFunctionParserRuleCall_5()); 
+    }
+    this_StatemachineFunction_5=ruleStatemachineFunction
+    { 
+        $current = $this_StatemachineFunction_5.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineStorageRetrieveParserRuleCall_6()); 
+    }
+    this_StatemachineStorageRetrieve_6=ruleStatemachineStorageRetrieve
+    { 
+        $current = $this_StatemachineStorageRetrieve_6.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceDtoAttributeParserRuleCall_7()); 
+    }
+    this_StatemachineActionFieldSourceDtoAttribute_7=ruleStatemachineActionFieldSourceDtoAttribute
+    { 
+        $current = $this_StatemachineActionFieldSourceDtoAttribute_7.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEventParserRuleCall_8()); 
+    }
+    this_StatemachineActionFieldSourceEvent_8=ruleStatemachineActionFieldSourceEvent
+    { 
+        $current = $this_StatemachineActionFieldSourceEvent_8.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionPeripheralPTResponseParserRuleCall_9()); 
+    }
+    this_StatemachineActionPeripheralPTResponse_9=ruleStatemachineActionPeripheralPTResponse
+    { 
+        $current = $this_StatemachineActionPeripheralPTResponse_9.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineOperation
+entryRuleStatemachineOperation returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineOperationRule()); }
+	 iv_ruleStatemachineOperation=ruleStatemachineOperation 
+	 { $current=$iv_ruleStatemachineOperation.current; } 
+	 EOF 
+;
+
+// Rule StatemachineOperation
+ruleStatemachineOperation returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='operation' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineOperationAccess().getOperationKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineOperationRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineOperationAccess().getOperationFunctionLibraryOperationCrossReference_1_0()); 
+	}
+
+)
+)	otherlv_2='(' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineOperationAccess().getLeftParenthesisKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineOperationAccess().getFirstStatemachineOperationParameterParserRuleCall_3_0()); 
+	    }
+		lv_first_3_0=ruleStatemachineOperationParameter		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineOperationRule());
+	        }
+       		set(
+       			$current, 
+       			"first",
+        		lv_first_3_0, 
+        		"StatemachineOperationParameter");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)?(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineOperationAccess().getMoreStatemachineOperationParameterMoreParserRuleCall_4_0()); 
+	    }
+		lv_more_4_0=ruleStatemachineOperationParameterMore		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineOperationRule());
+	        }
+       		add(
+       			$current, 
+       			"more",
+        		lv_more_4_0, 
+        		"StatemachineOperationParameterMore");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_5=')' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineOperationAccess().getRightParenthesisKeyword_5());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineGuard
+entryRuleStatemachineGuard returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineGuardRule()); }
+	 iv_ruleStatemachineGuard=ruleStatemachineGuard 
+	 { $current=$iv_ruleStatemachineGuard.current; } 
+	 EOF 
+;
+
+// Rule StatemachineGuard
+ruleStatemachineGuard returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='guard' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineGuardAccess().getGuardKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineGuardRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineGuardAccess().getGuardFunctionLibraryGuardCrossReference_1_0()); 
+	}
+
+)
+)((
+(
+		lv_hasOnFail_2_0=	'onFail' 
+    {
+        newLeafNode(lv_hasOnFail_2_0, grammarAccess.getStatemachineGuardAccess().getHasOnFailOnFailKeyword_2_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineGuardRule());
+	        }
+       		setWithLastConsumed($current, "hasOnFail", true, "onFail");
+	    }
+
+)
+)	otherlv_3='caption' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineGuardAccess().getCaptionKeyword_2_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineGuardAccess().getOnFailCaptionTRANSLATABLESTRINGParserRuleCall_2_2_0()); 
+	    }
+		lv_onFailCaption_4_0=ruleTRANSLATABLESTRING		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineGuardRule());
+	        }
+       		set(
+       			$current, 
+       			"onFailCaption",
+        		lv_onFailCaption_4_0, 
+        		"TRANSLATABLESTRING");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_5='description' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineGuardAccess().getDescriptionKeyword_2_3());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineGuardAccess().getOnFailDescriptionTRANSLATABLESTRINGParserRuleCall_2_4_0()); 
+	    }
+		lv_onFailDescription_6_0=ruleTRANSLATABLESTRING		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineGuardRule());
+	        }
+       		set(
+       			$current, 
+       			"onFailDescription",
+        		lv_onFailDescription_6_0, 
+        		"TRANSLATABLESTRING");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_7='type' 
+    {
+    	newLeafNode(otherlv_7, grammarAccess.getStatemachineGuardAccess().getTypeKeyword_2_5());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineGuardAccess().getOnFailTypeStatemachineUserMessageTypeEnumRuleCall_2_6_0()); 
+	    }
+		lv_onFailType_8_0=ruleStatemachineUserMessageType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineGuardRule());
+	        }
+       		set(
+       			$current, 
+       			"onFailType",
+        		lv_onFailType_8_0, 
+        		"StatemachineUserMessageType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))?)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineFunction
+entryRuleStatemachineFunction returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineFunctionRule()); }
+	 iv_ruleStatemachineFunction=ruleStatemachineFunction 
+	 { $current=$iv_ruleStatemachineFunction.current; } 
+	 EOF 
+;
+
+// Rule StatemachineFunction
+ruleStatemachineFunction returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='function' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineFunctionAccess().getFunctionKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineFunctionRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineFunctionAccess().getFunctionFunctionLibraryFunctionCrossReference_1_0()); 
+	}
+
+)
+)	otherlv_2='(' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineFunctionAccess().getLeftParenthesisKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineFunctionAccess().getFirstStatemachineOperationParameterParserRuleCall_3_0()); 
+	    }
+		lv_first_3_0=ruleStatemachineOperationParameter		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineFunctionRule());
+	        }
+       		set(
+       			$current, 
+       			"first",
+        		lv_first_3_0, 
+        		"StatemachineOperationParameter");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)?(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineFunctionAccess().getMoreStatemachineOperationParameterMoreParserRuleCall_4_0()); 
+	    }
+		lv_more_4_0=ruleStatemachineOperationParameterMore		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineFunctionRule());
+	        }
+       		add(
+       			$current, 
+       			"more",
+        		lv_more_4_0, 
+        		"StatemachineOperationParameterMore");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_5=')' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineFunctionAccess().getRightParenthesisKeyword_5());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineStorage
+entryRuleStatemachineStorage returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineStorageRule()); }
+	 iv_ruleStatemachineStorage=ruleStatemachineStorage 
+	 { $current=$iv_ruleStatemachineStorage.current; } 
+	 EOF 
+;
+
+// Rule StatemachineStorage
+ruleStatemachineStorage returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='store' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineStorageAccess().getStoreKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineStorageAccess().getContentStatemachineActionFieldConcatenationParserRuleCall_1_0()); 
+	    }
+		lv_content_1_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineStorageRule());
+	        }
+       		set(
+       			$current, 
+       			"content",
+        		lv_content_1_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_2='with' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineStorageAccess().getWithKeyword_2());
+    }
+(
+(
+		lv_key_3_0=RULE_ID
+		{
+			newLeafNode(lv_key_3_0, grammarAccess.getStatemachineStorageAccess().getKeyIDTerminalRuleCall_3_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStorageRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"key",
+        		lv_key_3_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_4='.' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineStorageAccess().getFullStopKeyword_4());
+    }
+(
+(
+		lv_attribute_5_0=RULE_ID
+		{
+			newLeafNode(lv_attribute_5_0, grammarAccess.getStatemachineStorageAccess().getAttributeIDTerminalRuleCall_5_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStorageRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"attribute",
+        		lv_attribute_5_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineStorageRetrieve
+entryRuleStatemachineStorageRetrieve returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineStorageRetrieveRule()); }
+	 iv_ruleStatemachineStorageRetrieve=ruleStatemachineStorageRetrieve 
+	 { $current=$iv_ruleStatemachineStorageRetrieve.current; } 
+	 EOF 
+;
+
+// Rule StatemachineStorageRetrieve
+ruleStatemachineStorageRetrieve returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='retrieve' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineStorageRetrieveAccess().getRetrieveKeyword_0());
+    }
+	otherlv_1='from' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineStorageRetrieveAccess().getFromKeyword_1());
+    }
+(
+(
+		lv_key_2_0=RULE_ID
+		{
+			newLeafNode(lv_key_2_0, grammarAccess.getStatemachineStorageRetrieveAccess().getKeyIDTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStorageRetrieveRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"key",
+        		lv_key_2_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_3='.' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineStorageRetrieveAccess().getFullStopKeyword_3());
+    }
+(
+(
+		lv_attribute_4_0=RULE_ID
+		{
+			newLeafNode(lv_attribute_4_0, grammarAccess.getStatemachineStorageRetrieveAccess().getAttributeIDTerminalRuleCall_4_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStorageRetrieveRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"attribute",
+        		lv_attribute_4_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionConditionalTransition
+entryRuleStatemachineActionConditionalTransition returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionConditionalTransitionRule()); }
+	 iv_ruleStatemachineActionConditionalTransition=ruleStatemachineActionConditionalTransition 
+	 { $current=$iv_ruleStatemachineActionConditionalTransition.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionConditionalTransition
+ruleStatemachineActionConditionalTransition returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='transition' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionConditionalTransitionAccess().getTransitionKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionConditionalTransitionRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionConditionalTransitionAccess().getTransitionStatemachineStateCrossReference_1_0()); 
+	}
+
+)
+)(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionConditionalTransitionAccess().getGuardStatemachineGuardParserRuleCall_2_0()); 
+	    }
+		lv_guard_2_0=ruleStatemachineGuard		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionConditionalTransitionRule());
+	        }
+       		set(
+       			$current, 
+       			"guard",
+        		lv_guard_2_0, 
+        		"StatemachineGuard");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_3='{' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionConditionalTransitionAccess().getLeftCurlyBracketKeyword_3());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionConditionalTransitionAccess().getActionsStatemachineActionParserRuleCall_4_0()); 
+	    }
+		lv_actions_4_0=ruleStatemachineAction		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionConditionalTransitionRule());
+	        }
+       		add(
+       			$current, 
+       			"actions",
+        		lv_actions_4_0, 
+        		"StatemachineAction");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_5='}' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionConditionalTransitionAccess().getRightCurlyBracketKeyword_5());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceString
+entryRuleStatemachineActionFieldSourceString returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceStringRule()); }
+	 iv_ruleStatemachineActionFieldSourceString=ruleStatemachineActionFieldSourceString 
+	 { $current=$iv_ruleStatemachineActionFieldSourceString.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceString
+ruleStatemachineActionFieldSourceString returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+(
+		lv_text_0_0=RULE_STRING
+		{
+			newLeafNode(lv_text_0_0, grammarAccess.getStatemachineActionFieldSourceStringAccess().getTextSTRINGTerminalRuleCall_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldSourceStringRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"text",
+        		lv_text_0_0, 
+        		"STRING");
+	    }
+
+)
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceNumber
+entryRuleStatemachineActionFieldSourceNumber returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceNumberRule()); }
+	 iv_ruleStatemachineActionFieldSourceNumber=ruleStatemachineActionFieldSourceNumber 
+	 { $current=$iv_ruleStatemachineActionFieldSourceNumber.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceNumber
+ruleStatemachineActionFieldSourceNumber returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceNumberAccess().getValueSignedNumberParserRuleCall_0()); 
+	    }
+		lv_value_0_0=ruleSignedNumber		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldSourceNumberRule());
+	        }
+       		set(
+       			$current, 
+       			"value",
+        		lv_value_0_0, 
+        		"SignedNumber");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceEvaluate
+entryRuleStatemachineActionFieldSourceEvaluate returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceEvaluateRule()); }
+	 iv_ruleStatemachineActionFieldSourceEvaluate=ruleStatemachineActionFieldSourceEvaluate 
+	 { $current=$iv_ruleStatemachineActionFieldSourceEvaluate.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceEvaluate
+ruleStatemachineActionFieldSourceEvaluate returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceEvaluateAccess().getEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_0()); 
+	    }
+		lv_evaluationtype_0_0=ruleStatemachineEvaluationType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldSourceEvaluateRule());
+	        }
+       		set(
+       			$current, 
+       			"evaluationtype",
+        		lv_evaluationtype_0_0, 
+        		"StatemachineEvaluationType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceEvent
+entryRuleStatemachineActionFieldSourceEvent returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceEventRule()); }
+	 iv_ruleStatemachineActionFieldSourceEvent=ruleStatemachineActionFieldSourceEvent 
+	 { $current=$iv_ruleStatemachineActionFieldSourceEvent.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceEvent
+ruleStatemachineActionFieldSourceEvent returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineActionFieldSourceEventAccess().getStatemachineActionFieldSourceEventAction_0(),
+            $current);
+    }
+)	otherlv_1='event' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldSourceEventAccess().getEventKeyword_1());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceTranslate
+entryRuleStatemachineActionFieldSourceTranslate returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceTranslateRule()); }
+	 iv_ruleStatemachineActionFieldSourceTranslate=ruleStatemachineActionFieldSourceTranslate 
+	 { $current=$iv_ruleStatemachineActionFieldSourceTranslate.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceTranslate
+ruleStatemachineActionFieldSourceTranslate returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='translate' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getTranslateKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getTextTRANSLATABLESTRINGParserRuleCall_1_0()); 
+	    }
+		lv_text_1_0=ruleTRANSLATABLESTRING		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldSourceTranslateRule());
+	        }
+       		set(
+       			$current, 
+       			"text",
+        		lv_text_1_0, 
+        		"TRANSLATABLESTRING");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceDtoAttribute
+entryRuleStatemachineActionFieldSourceDtoAttribute returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceDtoAttributeRule()); }
+	 iv_ruleStatemachineActionFieldSourceDtoAttribute=ruleStatemachineActionFieldSourceDtoAttribute 
+	 { $current=$iv_ruleStatemachineActionFieldSourceDtoAttribute.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceDtoAttribute
+ruleStatemachineActionFieldSourceDtoAttribute returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='dto' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getDtoKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldSourceDtoAttributeRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getDtoStatemachineControlDTOAttributeCrossReference_1_0()); 
+	}
+
+)
+)	otherlv_2='.' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getFullStopKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldSourceDtoAttributeRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getAttributeLDtoInheritedAttributeCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceMore
+entryRuleStatemachineActionFieldSourceMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreRule()); }
+	 iv_ruleStatemachineActionFieldSourceMore=ruleStatemachineActionFieldSourceMore 
+	 { $current=$iv_ruleStatemachineActionFieldSourceMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceMore
+ruleStatemachineActionFieldSourceMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceStringMoreParserRuleCall_0()); 
+    }
+    this_StatemachineActionFieldSourceStringMore_0=ruleStatemachineActionFieldSourceStringMore
+    { 
+        $current = $this_StatemachineActionFieldSourceStringMore_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceNumberMoreParserRuleCall_1()); 
+    }
+    this_StatemachineActionFieldSourceNumberMore_1=ruleStatemachineActionFieldSourceNumberMore
+    { 
+        $current = $this_StatemachineActionFieldSourceNumberMore_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceEvaluateMoreParserRuleCall_2()); 
+    }
+    this_StatemachineActionFieldSourceEvaluateMore_2=ruleStatemachineActionFieldSourceEvaluateMore
+    { 
+        $current = $this_StatemachineActionFieldSourceEvaluateMore_2.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceTranslateMoreParserRuleCall_3()); 
+    }
+    this_StatemachineActionFieldSourceTranslateMore_3=ruleStatemachineActionFieldSourceTranslateMore
+    { 
+        $current = $this_StatemachineActionFieldSourceTranslateMore_3.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldGetMoreParserRuleCall_4()); 
+    }
+    this_StatemachineActionFieldGetMore_4=ruleStatemachineActionFieldGetMore
+    { 
+        $current = $this_StatemachineActionFieldGetMore_4.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineOperationMoreParserRuleCall_5()); 
+    }
+    this_StatemachineOperationMore_5=ruleStatemachineOperationMore
+    { 
+        $current = $this_StatemachineOperationMore_5.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineStorageRetrieveMoreParserRuleCall_6()); 
+    }
+    this_StatemachineStorageRetrieveMore_6=ruleStatemachineStorageRetrieveMore
+    { 
+        $current = $this_StatemachineStorageRetrieveMore_6.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceDtoAttributeMoreParserRuleCall_7()); 
+    }
+    this_StatemachineActionFieldSourceDtoAttributeMore_7=ruleStatemachineActionFieldSourceDtoAttributeMore
+    { 
+        $current = $this_StatemachineActionFieldSourceDtoAttributeMore_7.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceStringMore
+entryRuleStatemachineActionFieldSourceStringMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceStringMoreRule()); }
+	 iv_ruleStatemachineActionFieldSourceStringMore=ruleStatemachineActionFieldSourceStringMore 
+	 { $current=$iv_ruleStatemachineActionFieldSourceStringMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceStringMore
+ruleStatemachineActionFieldSourceStringMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getStatemachineActionFieldSourceStringAction_0(),
+            $current);
+    }
+)	otherlv_1='+' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getPlusSignKeyword_1());
+    }
+(
+(
+		lv_text_2_0=RULE_STRING
+		{
+			newLeafNode(lv_text_2_0, grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getTextSTRINGTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldSourceStringMoreRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"text",
+        		lv_text_2_0, 
+        		"STRING");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceNumberMore
+entryRuleStatemachineActionFieldSourceNumberMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceNumberMoreRule()); }
+	 iv_ruleStatemachineActionFieldSourceNumberMore=ruleStatemachineActionFieldSourceNumberMore 
+	 { $current=$iv_ruleStatemachineActionFieldSourceNumberMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceNumberMore
+ruleStatemachineActionFieldSourceNumberMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getStatemachineActionFieldSourceNumberAction_0(),
+            $current);
+    }
+)	otherlv_1='+' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getPlusSignKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getValueSignedNumberParserRuleCall_2_0()); 
+	    }
+		lv_value_2_0=ruleSignedNumber		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldSourceNumberMoreRule());
+	        }
+       		set(
+       			$current, 
+       			"value",
+        		lv_value_2_0, 
+        		"SignedNumber");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceEvaluateMore
+entryRuleStatemachineActionFieldSourceEvaluateMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreRule()); }
+	 iv_ruleStatemachineActionFieldSourceEvaluateMore=ruleStatemachineActionFieldSourceEvaluateMore 
+	 { $current=$iv_ruleStatemachineActionFieldSourceEvaluateMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceEvaluateMore
+ruleStatemachineActionFieldSourceEvaluateMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getStatemachineActionFieldSourceEvaluateAction_0(),
+            $current);
+    }
+)	otherlv_1='+' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getPlusSignKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_2_0()); 
+	    }
+		lv_evaluationtype_2_0=ruleStatemachineEvaluationType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreRule());
+	        }
+       		set(
+       			$current, 
+       			"evaluationtype",
+        		lv_evaluationtype_2_0, 
+        		"StatemachineEvaluationType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceTranslateMore
+entryRuleStatemachineActionFieldSourceTranslateMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceTranslateMoreRule()); }
+	 iv_ruleStatemachineActionFieldSourceTranslateMore=ruleStatemachineActionFieldSourceTranslateMore 
+	 { $current=$iv_ruleStatemachineActionFieldSourceTranslateMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceTranslateMore
+ruleStatemachineActionFieldSourceTranslateMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getStatemachineActionFieldSourceTranslateAction_0(),
+            $current);
+    }
+)	otherlv_1='+' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getPlusSignKeyword_1());
+    }
+	otherlv_2='translate' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getTranslateKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getTextTRANSLATABLESTRINGParserRuleCall_3_0()); 
+	    }
+		lv_text_3_0=ruleTRANSLATABLESTRING		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldSourceTranslateMoreRule());
+	        }
+       		set(
+       			$current, 
+       			"text",
+        		lv_text_3_0, 
+        		"TRANSLATABLESTRING");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldGetMore
+entryRuleStatemachineActionFieldGetMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldGetMoreRule()); }
+	 iv_ruleStatemachineActionFieldGetMore=ruleStatemachineActionFieldGetMore 
+	 { $current=$iv_ruleStatemachineActionFieldGetMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldGetMore
+ruleStatemachineActionFieldGetMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineActionFieldGetMoreAccess().getStatemachineActionFieldGetAction_0(),
+            $current);
+    }
+)	otherlv_1='+' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldGetMoreAccess().getPlusSignKeyword_1());
+    }
+	otherlv_2='get' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionFieldGetMoreAccess().getGetKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldGetMoreRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionFieldGetMoreAccess().getAttributeStatemachineControlFieldAttributeCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineOperationMore
+entryRuleStatemachineOperationMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineOperationMoreRule()); }
+	 iv_ruleStatemachineOperationMore=ruleStatemachineOperationMore 
+	 { $current=$iv_ruleStatemachineOperationMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineOperationMore
+ruleStatemachineOperationMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineOperationMoreAccess().getStatemachineOperationAction_0(),
+            $current);
+    }
+)	otherlv_1='+' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineOperationMoreAccess().getPlusSignKeyword_1());
+    }
+	otherlv_2='operation' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineOperationMoreAccess().getOperationKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineOperationMoreRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineOperationMoreAccess().getOperationFunctionLibraryOperationCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineStorageRetrieveMore
+entryRuleStatemachineStorageRetrieveMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineStorageRetrieveMoreRule()); }
+	 iv_ruleStatemachineStorageRetrieveMore=ruleStatemachineStorageRetrieveMore 
+	 { $current=$iv_ruleStatemachineStorageRetrieveMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineStorageRetrieveMore
+ruleStatemachineStorageRetrieveMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineStorageRetrieveMoreAccess().getStatemachineStorageRetrieveAction_0(),
+            $current);
+    }
+)	otherlv_1='+' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineStorageRetrieveMoreAccess().getPlusSignKeyword_1());
+    }
+	otherlv_2='retrieve' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineStorageRetrieveMoreAccess().getRetrieveKeyword_2());
+    }
+	otherlv_3='from' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getStatemachineStorageRetrieveMoreAccess().getFromKeyword_3());
+    }
+(
+(
+		lv_key_4_0=RULE_ID
+		{
+			newLeafNode(lv_key_4_0, grammarAccess.getStatemachineStorageRetrieveMoreAccess().getKeyIDTerminalRuleCall_4_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStorageRetrieveMoreRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"key",
+        		lv_key_4_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_5='.' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getStatemachineStorageRetrieveMoreAccess().getFullStopKeyword_5());
+    }
+(
+(
+		lv_attribute_6_0=RULE_ID
+		{
+			newLeafNode(lv_attribute_6_0, grammarAccess.getStatemachineStorageRetrieveMoreAccess().getAttributeIDTerminalRuleCall_6_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineStorageRetrieveMoreRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"attribute",
+        		lv_attribute_6_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSourceDtoAttributeMore
+entryRuleStatemachineActionFieldSourceDtoAttributeMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreRule()); }
+	 iv_ruleStatemachineActionFieldSourceDtoAttributeMore=ruleStatemachineActionFieldSourceDtoAttributeMore 
+	 { $current=$iv_ruleStatemachineActionFieldSourceDtoAttributeMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSourceDtoAttributeMore
+ruleStatemachineActionFieldSourceDtoAttributeMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getStatemachineActionFieldSourceDtoAttributeAction_0(),
+            $current);
+    }
+)	otherlv_1='+' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getPlusSignKeyword_1());
+    }
+	otherlv_2='dto' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getDtoKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getDtoStatemachineControlDTOAttributeCrossReference_3_0()); 
+	}
+
+)
+)	otherlv_4='.' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getFullStopKeyword_4());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreRule());
+	        }
+        }
+	otherlv_5=RULE_ID
+	{
+		newLeafNode(otherlv_5, grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getAttributeLDtoInheritedAttributeCrossReference_5_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldConcatenation
+entryRuleStatemachineActionFieldConcatenation returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldConcatenationRule()); }
+	 iv_ruleStatemachineActionFieldConcatenation=ruleStatemachineActionFieldConcatenation 
+	 { $current=$iv_ruleStatemachineActionFieldConcatenation.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldConcatenation
+ruleStatemachineActionFieldConcatenation returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldConcatenationAccess().getFirstStatemachineActionFieldSourceParserRuleCall_0_0()); 
+	    }
+		lv_first_0_0=ruleStatemachineActionFieldSource		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldConcatenationRule());
+	        }
+       		set(
+       			$current, 
+       			"first",
+        		lv_first_0_0, 
+        		"StatemachineActionFieldSource");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldConcatenationAccess().getMoreStatemachineActionFieldSourceMoreParserRuleCall_1_0()); 
+	    }
+		lv_more_1_0=ruleStatemachineActionFieldSourceMore		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldConcatenationRule());
+	        }
+       		add(
+       			$current, 
+       			"more",
+        		lv_more_1_0, 
+        		"StatemachineActionFieldSourceMore");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineOperationParameter
+entryRuleStatemachineOperationParameter returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineOperationParameterRule()); }
+	 iv_ruleStatemachineOperationParameter=ruleStatemachineOperationParameter 
+	 { $current=$iv_ruleStatemachineOperationParameter.current; } 
+	 EOF 
+;
+
+// Rule StatemachineOperationParameter
+ruleStatemachineOperationParameter returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineOperationParameterAccess().getSourceStatemachineActionFieldConcatenationParserRuleCall_0()); 
+	    }
+		lv_source_0_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineOperationParameterRule());
+	        }
+       		set(
+       			$current, 
+       			"source",
+        		lv_source_0_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineOperationParameterMore
+entryRuleStatemachineOperationParameterMore returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineOperationParameterMoreRule()); }
+	 iv_ruleStatemachineOperationParameterMore=ruleStatemachineOperationParameterMore 
+	 { $current=$iv_ruleStatemachineOperationParameterMore.current; } 
+	 EOF 
+;
+
+// Rule StatemachineOperationParameterMore
+ruleStatemachineOperationParameterMore returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineOperationParameterMoreAccess().getStatemachineOperationParameterAction_0(),
+            $current);
+    }
+)	otherlv_1=',' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineOperationParameterMoreAccess().getCommaKeyword_1());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineOperationParameterMoreAccess().getSourceStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+	    }
+		lv_source_2_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineOperationParameterMoreRule());
+	        }
+       		set(
+       			$current, 
+       			"source",
+        		lv_source_2_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldSet
+entryRuleStatemachineActionFieldSet returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldSetRule()); }
+	 iv_ruleStatemachineActionFieldSet=ruleStatemachineActionFieldSet 
+	 { $current=$iv_ruleStatemachineActionFieldSet.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldSet
+ruleStatemachineActionFieldSet returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='set' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionFieldSetAccess().getSetKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionFieldSetAccess().getSourceStatemachineActionFieldConcatenationParserRuleCall_1_0()); 
+	    }
+		lv_source_1_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionFieldSetRule());
+	        }
+       		set(
+       			$current, 
+       			"source",
+        		lv_source_1_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionFieldSetAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldSetRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionFieldSetAccess().getAttributeStatemachineControlFieldAttributeCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldClear
+entryRuleStatemachineActionFieldClear returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldClearRule()); }
+	 iv_ruleStatemachineActionFieldClear=ruleStatemachineActionFieldClear 
+	 { $current=$iv_ruleStatemachineActionFieldClear.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldClear
+ruleStatemachineActionFieldClear returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='clear' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionFieldClearAccess().getClearKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldClearRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldClearAccess().getAttributeStatemachineControlFieldAttributeCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldGet
+entryRuleStatemachineActionFieldGet returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldGetRule()); }
+	 iv_ruleStatemachineActionFieldGet=ruleStatemachineActionFieldGet 
+	 { $current=$iv_ruleStatemachineActionFieldGet.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldGet
+ruleStatemachineActionFieldGet returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='get' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionFieldGetAccess().getGetKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldGetRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldGetAccess().getAttributeStatemachineControlFieldAttributeCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionFieldRemove
+entryRuleStatemachineActionFieldRemove returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionFieldRemoveRule()); }
+	 iv_ruleStatemachineActionFieldRemove=ruleStatemachineActionFieldRemove 
+	 { $current=$iv_ruleStatemachineActionFieldRemove.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionFieldRemove
+ruleStatemachineActionFieldRemove returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='remove' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionFieldRemoveAccess().getRemoveKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionFieldRemoveRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionFieldRemoveAccess().getAttributeStatemachineControlFieldAttributeCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionItemVisible
+entryRuleStatemachineActionItemVisible returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionItemVisibleRule()); }
+	 iv_ruleStatemachineActionItemVisible=ruleStatemachineActionItemVisible 
+	 { $current=$iv_ruleStatemachineActionItemVisible.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionItemVisible
+ruleStatemachineActionItemVisible returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='visible' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionItemVisibleAccess().getVisibleKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionItemVisibleRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionItemVisibleAccess().getAttributeStatemachineControlVisibilityCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionItemInvisible
+entryRuleStatemachineActionItemInvisible returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionItemInvisibleRule()); }
+	 iv_ruleStatemachineActionItemInvisible=ruleStatemachineActionItemInvisible 
+	 { $current=$iv_ruleStatemachineActionItemInvisible.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionItemInvisible
+ruleStatemachineActionItemInvisible returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='invisible' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionItemInvisibleAccess().getInvisibleKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionItemInvisibleRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionItemInvisibleAccess().getAttributeStatemachineControlVisibilityCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionButtonCaption
+entryRuleStatemachineActionButtonCaption returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionButtonCaptionRule()); }
+	 iv_ruleStatemachineActionButtonCaption=ruleStatemachineActionButtonCaption 
+	 { $current=$iv_ruleStatemachineActionButtonCaption.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionButtonCaption
+ruleStatemachineActionButtonCaption returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='caption' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionButtonCaptionAccess().getCaptionKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionButtonCaptionAccess().getCaptionStatemachineActionFieldConcatenationParserRuleCall_1_0()); 
+	    }
+		lv_caption_1_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionButtonCaptionRule());
+	        }
+       		set(
+       			$current, 
+       			"caption",
+        		lv_caption_1_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionButtonCaptionAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionButtonCaptionRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionButtonCaptionAccess().getAttributeStatemachineControlButtonAttributeCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionButtonImage
+entryRuleStatemachineActionButtonImage returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionButtonImageRule()); }
+	 iv_ruleStatemachineActionButtonImage=ruleStatemachineActionButtonImage 
+	 { $current=$iv_ruleStatemachineActionButtonImage.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionButtonImage
+ruleStatemachineActionButtonImage returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='image' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionButtonImageAccess().getImageKeyword_0());
+    }
+(
+(
+		lv_image_1_0=RULE_STRING
+		{
+			newLeafNode(lv_image_1_0, grammarAccess.getStatemachineActionButtonImageAccess().getImageSTRINGTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionButtonImageRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"image",
+        		lv_image_1_0, 
+        		"STRING");
+	    }
+
+)
+)	otherlv_2='@' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionButtonImageAccess().getCommercialAtKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionButtonImageRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionButtonImageAccess().getAttributeStatemachineControlButtonAttributeCrossReference_3_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionDTOFind
+entryRuleStatemachineActionDTOFind returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionDTOFindRule()); }
+	 iv_ruleStatemachineActionDTOFind=ruleStatemachineActionDTOFind 
+	 { $current=$iv_ruleStatemachineActionDTOFind.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionDTOFind
+ruleStatemachineActionDTOFind returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='search' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionDTOFindAccess().getSearchKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineActionDTOFindAccess().getSearchStatemachineActionFieldConcatenationParserRuleCall_1_0()); 
+	    }
+		lv_search_1_0=ruleStatemachineActionFieldConcatenation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineActionDTOFindRule());
+	        }
+       		set(
+       			$current, 
+       			"search",
+        		lv_search_1_0, 
+        		"StatemachineActionFieldConcatenation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_2='in' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionDTOFindAccess().getInKeyword_2());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionDTOFindRule());
+	        }
+        }
+	otherlv_3=RULE_ID
+	{
+		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionDTOFindAccess().getDtoStatemachineControlDTOAttributeCrossReference_3_0()); 
+	}
+
+)
+)	otherlv_4='.' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineActionDTOFindAccess().getFullStopKeyword_4());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionDTOFindRule());
+	        }
+        }
+	otherlv_5=RULE_ID
+	{
+		newLeafNode(otherlv_5, grammarAccess.getStatemachineActionDTOFindAccess().getAttributeLDtoInheritedAttributeCrossReference_5_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineActionScheduler
+entryRuleStatemachineActionScheduler returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineActionSchedulerRule()); }
+	 iv_ruleStatemachineActionScheduler=ruleStatemachineActionScheduler 
+	 { $current=$iv_ruleStatemachineActionScheduler.current; } 
+	 EOF 
+;
+
+// Rule StatemachineActionScheduler
+ruleStatemachineActionScheduler returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='schedule' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionSchedulerAccess().getScheduleKeyword_0());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineActionSchedulerRule());
+	        }
+        }
+	otherlv_1=RULE_ID
+	{
+		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionSchedulerAccess().getSchedulerStatemachineControlSchedulerAttributeCrossReference_1_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControl
+entryRuleStatemachineControl returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlRule()); }
+	 iv_ruleStatemachineControl=ruleStatemachineControl 
+	 { $current=$iv_ruleStatemachineControl.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControl
+ruleStatemachineControl returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getStatemachineControlAccess().getStatemachineControlButtonParserRuleCall_0()); 
+    }
+    this_StatemachineControlButton_0=ruleStatemachineControlButton
+    { 
+        $current = $this_StatemachineControlButton_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineControlAccess().getStatemachineControlFieldParserRuleCall_1()); 
+    }
+    this_StatemachineControlField_1=ruleStatemachineControlField
+    { 
+        $current = $this_StatemachineControlField_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineControlAccess().getStatemachineControlDTOParserRuleCall_2()); 
+    }
+    this_StatemachineControlDTO_2=ruleStatemachineControlDTO
+    { 
+        $current = $this_StatemachineControlDTO_2.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineControlAccess().getStatemachineControlSchedulerParserRuleCall_3()); 
+    }
+    this_StatemachineControlScheduler_3=ruleStatemachineControlScheduler
+    { 
+        $current = $this_StatemachineControlScheduler_3.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineControlAccess().getStatemachineControlPeripheralParserRuleCall_4()); 
+    }
+    this_StatemachineControlPeripheral_4=ruleStatemachineControlPeripheral
+    { 
+        $current = $this_StatemachineControlPeripheral_4.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlButton
+entryRuleStatemachineControlButton returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlButtonRule()); }
+	 iv_ruleStatemachineControlButton=ruleStatemachineControlButton 
+	 { $current=$iv_ruleStatemachineControlButton.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlButton
+ruleStatemachineControlButton returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='keypad' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlButtonAccess().getKeypadKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineControlButtonAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlButtonRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_2='event' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineControlButtonAccess().getEventKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlButtonAccess().getEventTypeStatemachineControlButtonEventTypeEnumRuleCall_3_0()); 
+	    }
+		lv_eventType_3_0=ruleStatemachineControlButtonEventType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlButtonRule());
+	        }
+       		set(
+       			$current, 
+       			"eventType",
+        		lv_eventType_3_0, 
+        		"StatemachineControlButtonEventType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_4='{' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineControlButtonAccess().getLeftCurlyBracketKeyword_4());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlButtonAccess().getButtonsStatemachineControlButtonAttributeParserRuleCall_5_0()); 
+	    }
+		lv_buttons_5_0=ruleStatemachineControlButtonAttribute		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlButtonRule());
+	        }
+       		add(
+       			$current, 
+       			"buttons",
+        		lv_buttons_5_0, 
+        		"StatemachineControlButtonAttribute");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_6='}' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getStatemachineControlButtonAccess().getRightCurlyBracketKeyword_6());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlField
+entryRuleStatemachineControlField returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlFieldRule()); }
+	 iv_ruleStatemachineControlField=ruleStatemachineControlField 
+	 { $current=$iv_ruleStatemachineControlField.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlField
+ruleStatemachineControlField returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='fields' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlFieldAccess().getFieldsKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineControlFieldAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlFieldRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_2='{' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineControlFieldAccess().getLeftCurlyBracketKeyword_2());
+    }
+(
+
+(
+	{ 
+	  getUnorderedGroupHelper().enter(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3());
+	}
+	(
+		(
+
+			( 
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3(), 0)}?=>(
+					{ 
+	 				  getUnorderedGroupHelper().select(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3(), 0);
+	 				}
+					({true}?=>(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlFieldAccess().getFieldsStatemachineControlFieldAttributeParserRuleCall_3_0_0()); 
+	    }
+		lv_fields_4_0=ruleStatemachineControlFieldAttribute		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlFieldRule());
+	        }
+       		add(
+       			$current, 
+       			"fields",
+        		lv_fields_4_0, 
+        		"StatemachineControlFieldAttribute");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))+
+					{ 
+	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3());
+	 				}
+ 				)
+			)  |
+
+			( 
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3(), 1)}?=>(
+					{ 
+	 				  getUnorderedGroupHelper().select(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3(), 1);
+	 				}
+					({true}?=>(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlFieldAccess().getLayoutsStatemachineControlFieldLayoutParserRuleCall_3_1_0()); 
+	    }
+		lv_layouts_5_0=ruleStatemachineControlFieldLayout		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlFieldRule());
+	        }
+       		add(
+       			$current, 
+       			"layouts",
+        		lv_layouts_5_0, 
+        		"StatemachineControlFieldLayout");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))+
+					{ 
+	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3());
+	 				}
+ 				)
+			)  
+
+		)*	
+	)
+)
+	{ 
+	  getUnorderedGroupHelper().leave(grammarAccess.getStatemachineControlFieldAccess().getUnorderedGroup_3());
+	}
+
+)	otherlv_6='}' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getStatemachineControlFieldAccess().getRightCurlyBracketKeyword_4());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlDTO
+entryRuleStatemachineControlDTO returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlDTORule()); }
+	 iv_ruleStatemachineControlDTO=ruleStatemachineControlDTO 
+	 { $current=$iv_ruleStatemachineControlDTO.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlDTO
+ruleStatemachineControlDTO returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='dataProvider' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlDTOAccess().getDataProviderKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineControlDTOAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlDTORule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_2='{' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineControlDTOAccess().getLeftCurlyBracketKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlDTOAccess().getDtosStatemachineControlDTOAttributeParserRuleCall_3_0()); 
+	    }
+		lv_dtos_3_0=ruleStatemachineControlDTOAttribute		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlDTORule());
+	        }
+       		add(
+       			$current, 
+       			"dtos",
+        		lv_dtos_3_0, 
+        		"StatemachineControlDTOAttribute");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_4='}' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineControlDTOAccess().getRightCurlyBracketKeyword_4());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlScheduler
+entryRuleStatemachineControlScheduler returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlSchedulerRule()); }
+	 iv_ruleStatemachineControlScheduler=ruleStatemachineControlScheduler 
+	 { $current=$iv_ruleStatemachineControlScheduler.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlScheduler
+ruleStatemachineControlScheduler returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='scheduler' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlSchedulerAccess().getSchedulerKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineControlSchedulerAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlSchedulerRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_2='{' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineControlSchedulerAccess().getLeftCurlyBracketKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlSchedulerAccess().getSchedulersStatemachineControlSchedulerAttributeParserRuleCall_3_0()); 
+	    }
+		lv_schedulers_3_0=ruleStatemachineControlSchedulerAttribute		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlSchedulerRule());
+	        }
+       		add(
+       			$current, 
+       			"schedulers",
+        		lv_schedulers_3_0, 
+        		"StatemachineControlSchedulerAttribute");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_4='}' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineControlSchedulerAccess().getRightCurlyBracketKeyword_4());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachinePeripheralDeviceLineDisplay
+entryRuleStatemachinePeripheralDeviceLineDisplay returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachinePeripheralDeviceLineDisplayRule()); }
+	 iv_ruleStatemachinePeripheralDeviceLineDisplay=ruleStatemachinePeripheralDeviceLineDisplay 
+	 { $current=$iv_ruleStatemachinePeripheralDeviceLineDisplay.current; } 
+	 EOF 
+;
+
+// Rule StatemachinePeripheralDeviceLineDisplay
+ruleStatemachinePeripheralDeviceLineDisplay returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='lineDisplay' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getLineDisplayKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachinePeripheralDeviceLineDisplayRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachinePeripheralDevicePOSPrinter
+entryRuleStatemachinePeripheralDevicePOSPrinter returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachinePeripheralDevicePOSPrinterRule()); }
+	 iv_ruleStatemachinePeripheralDevicePOSPrinter=ruleStatemachinePeripheralDevicePOSPrinter 
+	 { $current=$iv_ruleStatemachinePeripheralDevicePOSPrinter.current; } 
+	 EOF 
+;
+
+// Rule StatemachinePeripheralDevicePOSPrinter
+ruleStatemachinePeripheralDevicePOSPrinter returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='posPrinter' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getPosPrinterKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachinePeripheralDevicePOSPrinterRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachinePeripheralDeviceCashDrawer
+entryRuleStatemachinePeripheralDeviceCashDrawer returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachinePeripheralDeviceCashDrawerRule()); }
+	 iv_ruleStatemachinePeripheralDeviceCashDrawer=ruleStatemachinePeripheralDeviceCashDrawer 
+	 { $current=$iv_ruleStatemachinePeripheralDeviceCashDrawer.current; } 
+	 EOF 
+;
+
+// Rule StatemachinePeripheralDeviceCashDrawer
+ruleStatemachinePeripheralDeviceCashDrawer returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='cashDrawer' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getCashDrawerKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachinePeripheralDeviceCashDrawerRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachinePeripheralDevicePT
+entryRuleStatemachinePeripheralDevicePT returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachinePeripheralDevicePTRule()); }
+	 iv_ruleStatemachinePeripheralDevicePT=ruleStatemachinePeripheralDevicePT 
+	 { $current=$iv_ruleStatemachinePeripheralDevicePT.current; } 
+	 EOF 
+;
+
+// Rule StatemachinePeripheralDevicePT
+ruleStatemachinePeripheralDevicePT returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='payment' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachinePeripheralDevicePTAccess().getPaymentKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachinePeripheralDevicePTAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachinePeripheralDevicePTRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlPeripheral
+entryRuleStatemachineControlPeripheral returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlPeripheralRule()); }
+	 iv_ruleStatemachineControlPeripheral=ruleStatemachineControlPeripheral 
+	 { $current=$iv_ruleStatemachineControlPeripheral.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlPeripheral
+ruleStatemachineControlPeripheral returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='peripheral' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlPeripheralAccess().getPeripheralKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineControlPeripheralAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlPeripheralRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_2='{' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineControlPeripheralAccess().getLeftCurlyBracketKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlPeripheralAccess().getLineDisplaysStatemachinePeripheralDeviceLineDisplayParserRuleCall_3_0()); 
+	    }
+		lv_lineDisplays_3_0=ruleStatemachinePeripheralDeviceLineDisplay		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlPeripheralRule());
+	        }
+       		add(
+       			$current, 
+       			"lineDisplays",
+        		lv_lineDisplays_3_0, 
+        		"StatemachinePeripheralDeviceLineDisplay");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlPeripheralAccess().getPosPrintersStatemachinePeripheralDevicePOSPrinterParserRuleCall_4_0()); 
+	    }
+		lv_posPrinters_4_0=ruleStatemachinePeripheralDevicePOSPrinter		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlPeripheralRule());
+	        }
+       		add(
+       			$current, 
+       			"posPrinters",
+        		lv_posPrinters_4_0, 
+        		"StatemachinePeripheralDevicePOSPrinter");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlPeripheralAccess().getCashDrawersStatemachinePeripheralDeviceCashDrawerParserRuleCall_5_0()); 
+	    }
+		lv_cashDrawers_5_0=ruleStatemachinePeripheralDeviceCashDrawer		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlPeripheralRule());
+	        }
+       		add(
+       			$current, 
+       			"cashDrawers",
+        		lv_cashDrawers_5_0, 
+        		"StatemachinePeripheralDeviceCashDrawer");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlPeripheralAccess().getPaymentTerminalsStatemachinePeripheralDevicePTParserRuleCall_6_0()); 
+	    }
+		lv_paymentTerminals_6_0=ruleStatemachinePeripheralDevicePT		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlPeripheralRule());
+	        }
+       		add(
+       			$current, 
+       			"paymentTerminals",
+        		lv_paymentTerminals_6_0, 
+        		"StatemachinePeripheralDevicePT");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)*	otherlv_7='}' 
+    {
+    	newLeafNode(otherlv_7, grammarAccess.getStatemachineControlPeripheralAccess().getRightCurlyBracketKeyword_7());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttribute
+entryRuleStatemachineControlButtonAttribute returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeRule()); }
+	 iv_ruleStatemachineControlButtonAttribute=ruleStatemachineControlButtonAttribute 
+	 { $current=$iv_ruleStatemachineControlButtonAttribute.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttribute
+ruleStatemachineControlButtonAttribute returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='button' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlButtonAttributeAccess().getButtonKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeAccess().getNameTRANSLATABLEIDParserRuleCall_1_0()); 
+	    }
+		lv_name_1_0=ruleTRANSLATABLEID		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlButtonAttributeRule());
+	        }
+       		set(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"TRANSLATABLEID");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)((
+(
+		lv_hasImage_2_0=	'image' 
+    {
+        newLeafNode(lv_hasImage_2_0, grammarAccess.getStatemachineControlButtonAttributeAccess().getHasImageImageKeyword_2_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlButtonAttributeRule());
+	        }
+       		setWithLastConsumed($current, "hasImage", true, "image");
+	    }
+
+)
+)(
+(
+		lv_image_3_0=RULE_STRING
+		{
+			newLeafNode(lv_image_3_0, grammarAccess.getStatemachineControlButtonAttributeAccess().getImageSTRINGTerminalRuleCall_2_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlButtonAttributeRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"image",
+        		lv_image_3_0, 
+        		"STRING");
+	    }
+
+)
+))?(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeAccess().getEventStatemachineControlButtonAttributeEventParserRuleCall_3_0()); 
+	    }
+		lv_event_4_0=ruleStatemachineControlButtonAttributeEvent		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlButtonAttributeRule());
+	        }
+       		set(
+       			$current, 
+       			"event",
+        		lv_event_4_0, 
+        		"StatemachineControlButtonAttributeEvent");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttributeEvent
+entryRuleStatemachineControlButtonAttributeEvent returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeEventRule()); }
+	 iv_ruleStatemachineControlButtonAttributeEvent=ruleStatemachineControlButtonAttributeEvent 
+	 { $current=$iv_ruleStatemachineControlButtonAttributeEvent.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttributeEvent
+ruleStatemachineControlButtonAttributeEvent returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventKeyboardParserRuleCall_0()); 
+    }
+    this_StatemachineControlButtonAttributeEventKeyboard_0=ruleStatemachineControlButtonAttributeEventKeyboard
+    { 
+        $current = $this_StatemachineControlButtonAttributeEventKeyboard_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventIdentityParserRuleCall_1()); 
+    }
+    this_StatemachineControlButtonAttributeEventIdentity_1=ruleStatemachineControlButtonAttributeEventIdentity
+    { 
+        $current = $this_StatemachineControlButtonAttributeEventIdentity_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventEventParserRuleCall_2()); 
+    }
+    this_StatemachineControlButtonAttributeEventEvent_2=ruleStatemachineControlButtonAttributeEventEvent
+    { 
+        $current = $this_StatemachineControlButtonAttributeEventEvent_2.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttributeEventKeyboard
+entryRuleStatemachineControlButtonAttributeEventKeyboard returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardRule()); }
+	 iv_ruleStatemachineControlButtonAttributeEventKeyboard=ruleStatemachineControlButtonAttributeEventKeyboard 
+	 { $current=$iv_ruleStatemachineControlButtonAttributeEventKeyboard.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttributeEventKeyboard
+ruleStatemachineControlButtonAttributeEventKeyboard returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getStatemachineControlButtonAttributeEventKeyboardAction_0(),
+            $current);
+    }
+)	otherlv_1='key' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getKeyKeyword_1());
+    }
+(
+(
+		lv_keystroke_2_0=RULE_STRING
+		{
+			newLeafNode(lv_keystroke_2_0, grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getKeystrokeSTRINGTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"keystroke",
+        		lv_keystroke_2_0, 
+        		"STRING");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttributeEventIdentity
+entryRuleStatemachineControlButtonAttributeEventIdentity returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeEventIdentityRule()); }
+	 iv_ruleStatemachineControlButtonAttributeEventIdentity=ruleStatemachineControlButtonAttributeEventIdentity 
+	 { $current=$iv_ruleStatemachineControlButtonAttributeEventIdentity.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttributeEventIdentity
+ruleStatemachineControlButtonAttributeEventIdentity returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getStatemachineControlButtonAttributeEventIdentityAction_0(),
+            $current);
+    }
+)	otherlv_1='id' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getIdKeyword_1());
+    }
+(
+(
+		lv_identity_2_0=RULE_INT
+		{
+			newLeafNode(lv_identity_2_0, grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getIdentityINTTerminalRuleCall_2_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlButtonAttributeEventIdentityRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"identity",
+        		lv_identity_2_0, 
+        		"INT");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlButtonAttributeEventEvent
+entryRuleStatemachineControlButtonAttributeEventEvent returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlButtonAttributeEventEventRule()); }
+	 iv_ruleStatemachineControlButtonAttributeEventEvent=ruleStatemachineControlButtonAttributeEventEvent 
+	 { $current=$iv_ruleStatemachineControlButtonAttributeEventEvent.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlButtonAttributeEventEvent
+ruleStatemachineControlButtonAttributeEventEvent returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getStatemachineControlButtonAttributeEventEventAction_0(),
+            $current);
+    }
+)	otherlv_1='event' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getEventKeyword_1());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlButtonAttributeEventEventRule());
+	        }
+        }
+	otherlv_2=RULE_ID
+	{
+		newLeafNode(otherlv_2, grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getEventStatemachineEventCrossReference_2_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlFieldAttribute
+entryRuleStatemachineControlFieldAttribute returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlFieldAttributeRule()); }
+	 iv_ruleStatemachineControlFieldAttribute=ruleStatemachineControlFieldAttribute 
+	 { $current=$iv_ruleStatemachineControlFieldAttribute.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlFieldAttribute
+ruleStatemachineControlFieldAttribute returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='field' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlFieldAttributeAccess().getFieldKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlFieldAttributeAccess().getNameTRANSLATABLEIDParserRuleCall_1_0()); 
+	    }
+		lv_name_1_0=ruleTRANSLATABLEID		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlFieldAttributeRule());
+	        }
+       		set(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"TRANSLATABLEID");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_2='type' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineControlFieldAttributeAccess().getTypeKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlFieldAttributeAccess().getAttributeTypeStatemachineFieldTypeParserRuleCall_3_0()); 
+	    }
+		lv_attributeType_3_0=ruleStatemachineFieldType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlFieldAttributeRule());
+	        }
+       		set(
+       			$current, 
+       			"attributeType",
+        		lv_attributeType_3_0, 
+        		"StatemachineFieldType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlFieldLayout
+entryRuleStatemachineControlFieldLayout returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlFieldLayoutRule()); }
+	 iv_ruleStatemachineControlFieldLayout=ruleStatemachineControlFieldLayout 
+	 { $current=$iv_ruleStatemachineControlFieldLayout.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlFieldLayout
+ruleStatemachineControlFieldLayout returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='layout' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlFieldLayoutAccess().getLayoutKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineControlFieldLayoutAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlFieldLayoutRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlDTOAttribute
+entryRuleStatemachineControlDTOAttribute returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlDTOAttributeRule()); }
+	 iv_ruleStatemachineControlDTOAttribute=ruleStatemachineControlDTOAttribute 
+	 { $current=$iv_ruleStatemachineControlDTOAttribute.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlDTOAttribute
+ruleStatemachineControlDTOAttribute returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='dto' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlDTOAttributeAccess().getDtoKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineControlDTOAttributeAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlDTOAttributeRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_2='type' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineControlDTOAttributeAccess().getTypeKeyword_2());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineControlDTOAttributeAccess().getAttributeTypeStatemachineDTOTypeParserRuleCall_3_0()); 
+	    }
+		lv_attributeType_3_0=ruleStatemachineDTOType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineControlDTOAttributeRule());
+	        }
+       		set(
+       			$current, 
+       			"attributeType",
+        		lv_attributeType_3_0, 
+        		"StatemachineDTOType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)((
+(
+		lv_hasEvent_4_0=	'event' 
+    {
+        newLeafNode(lv_hasEvent_4_0, grammarAccess.getStatemachineControlDTOAttributeAccess().getHasEventEventKeyword_4_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlDTOAttributeRule());
+	        }
+       		setWithLastConsumed($current, "hasEvent", true, "event");
+	    }
+
+)
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlDTOAttributeRule());
+	        }
+        }
+	otherlv_5=RULE_ID
+	{
+		newLeafNode(otherlv_5, grammarAccess.getStatemachineControlDTOAttributeAccess().getEventStatemachineEventCrossReference_4_1_0()); 
+	}
+
+)
+))?)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineControlSchedulerAttribute
+entryRuleStatemachineControlSchedulerAttribute returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineControlSchedulerAttributeRule()); }
+	 iv_ruleStatemachineControlSchedulerAttribute=ruleStatemachineControlSchedulerAttribute 
+	 { $current=$iv_ruleStatemachineControlSchedulerAttribute.current; } 
+	 EOF 
+;
+
+// Rule StatemachineControlSchedulerAttribute
+ruleStatemachineControlSchedulerAttribute returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='scheduler' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineControlSchedulerAttributeAccess().getSchedulerKeyword_0());
+    }
+(
+(
+		lv_name_1_0=RULE_ID
+		{
+			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineControlSchedulerAttributeAccess().getNameIDTerminalRuleCall_1_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlSchedulerAttributeRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"name",
+        		lv_name_1_0, 
+        		"ID");
+	    }
+
+)
+)	otherlv_2='delay' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getStatemachineControlSchedulerAttributeAccess().getDelayKeyword_2());
+    }
+(
+(
+		lv_delay_3_0=RULE_INT
+		{
+			newLeafNode(lv_delay_3_0, grammarAccess.getStatemachineControlSchedulerAttributeAccess().getDelayINTTerminalRuleCall_3_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlSchedulerAttributeRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"delay",
+        		lv_delay_3_0, 
+        		"INT");
+	    }
+
+)
+)	otherlv_4='send' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getStatemachineControlSchedulerAttributeAccess().getSendKeyword_4());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineControlSchedulerAttributeRule());
+	        }
+        }
+	otherlv_5=RULE_ID
+	{
+		newLeafNode(otherlv_5, grammarAccess.getStatemachineControlSchedulerAttributeAccess().getEventStatemachineEventCrossReference_5_0()); 
+	}
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineDTOType
+entryRuleStatemachineDTOType returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineDTOTypeRule()); }
+	 iv_ruleStatemachineDTOType=ruleStatemachineDTOType 
+	 { $current=$iv_ruleStatemachineDTOType.current; } 
+	 EOF 
+;
+
+// Rule StatemachineDTOType
+ruleStatemachineDTOType returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStatemachineDTOTypeRule());
+	        }
+        }
+	otherlv_0=RULE_ID
+	{
+		newLeafNode(otherlv_0, grammarAccess.getStatemachineDTOTypeAccess().getAttributeTypeLDtoCrossReference_0()); 
+	}
+
+)
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineFieldType
+entryRuleStatemachineFieldType returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineFieldTypeRule()); }
+	 iv_ruleStatemachineFieldType=ruleStatemachineFieldType 
+	 { $current=$iv_ruleStatemachineFieldType.current; } 
+	 EOF 
+;
+
+// Rule StatemachineFieldType
+ruleStatemachineFieldType returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineFieldTypeAccess().getAttributeTypeStatemachineInternalTypeEnumRuleCall_0()); 
+	    }
+		lv_attributeType_0_0=ruleStatemachineInternalType		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineFieldTypeRule());
+	        }
+       		set(
+       			$current, 
+       			"attributeType",
+        		lv_attributeType_0_0, 
+        		"StatemachineInternalType");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineImport
+entryRuleStatemachineImport returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineImportRule()); }
+	 iv_ruleStatemachineImport=ruleStatemachineImport 
+	 { $current=$iv_ruleStatemachineImport.current; } 
+	 EOF 
+;
+
+// Rule StatemachineImport
+ruleStatemachineImport returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='import' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getStatemachineImportAccess().getImportKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getStatemachineImportAccess().getImportedNamespaceStatemachineQualifiedNameWithWildCardParserRuleCall_1_0()); 
+	    }
+		lv_importedNamespace_1_0=ruleStatemachineQualifiedNameWithWildCard		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getStatemachineImportRule());
+	        }
+       		set(
+       			$current, 
+       			"importedNamespace",
+        		lv_importedNamespace_1_0, 
+        		"StatemachineQualifiedNameWithWildCard");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStatemachineQualifiedNameWithWildCard
+entryRuleStatemachineQualifiedNameWithWildCard returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStatemachineQualifiedNameWithWildCardRule()); } 
+	 iv_ruleStatemachineQualifiedNameWithWildCard=ruleStatemachineQualifiedNameWithWildCard 
+	 { $current=$iv_ruleStatemachineQualifiedNameWithWildCard.current.getText(); }  
+	 EOF 
+;
+
+// Rule StatemachineQualifiedNameWithWildCard
+ruleStatemachineQualifiedNameWithWildCard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().getQualifiedNameParserRuleCall_0()); 
+    }
+    this_QualifiedName_0=ruleQualifiedName    {
+		$current.merge(this_QualifiedName_0);
+    }
+
+    { 
+        afterParserOrEnumRuleCall();
+    }
+(
+	kw='.' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().getFullStopKeyword_1_0()); 
+    }
+
+	kw='*' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().getAsteriskKeyword_1_1()); 
+    }
+)?)
+    ;
+
+
+
+
+
+// Entry rule entryRuleQualifiedName
+entryRuleQualifiedName returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getQualifiedNameRule()); } 
+	 iv_ruleQualifiedName=ruleQualifiedName 
+	 { $current=$iv_ruleQualifiedName.current.getText(); }  
+	 EOF 
+;
+
+// Rule QualifiedName
+ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
+    }
+    this_ValidID_0=ruleValidID    {
+		$current.merge(this_ValidID_0);
+    }
+
+    { 
+        afterParserOrEnumRuleCall();
+    }
+(((
+	'.' 
+)=>
+	kw='.' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
+    }
+)
+    { 
+        newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
+    }
+    this_ValidID_2=ruleValidID    {
+		$current.merge(this_ValidID_2);
+    }
+
+    { 
+        afterParserOrEnumRuleCall();
+    }
+)*)
+    ;
+
+
+
+
+
+// Entry rule entryRuleValidID
+entryRuleValidID returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getValidIDRule()); } 
+	 iv_ruleValidID=ruleValidID 
+	 { $current=$iv_ruleValidID.current.getText(); }  
+	 EOF 
+;
+
+// Rule ValidID
+ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+    this_ID_0=RULE_ID    {
+		$current.merge(this_ID_0);
+    }
+
+    { 
+    newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
+    }
+
+    ;
+
+
+
+
+
+// Entry rule entryRuleTRANSLATABLESTRING
+entryRuleTRANSLATABLESTRING returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getTRANSLATABLESTRINGRule()); } 
+	 iv_ruleTRANSLATABLESTRING=ruleTRANSLATABLESTRING 
+	 { $current=$iv_ruleTRANSLATABLESTRING.current.getText(); }  
+	 EOF 
+;
+
+// Rule TRANSLATABLESTRING
+ruleTRANSLATABLESTRING returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+    this_STRING_0=RULE_STRING    {
+		$current.merge(this_STRING_0);
+    }
+
+    { 
+    newLeafNode(this_STRING_0, grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); 
+    }
+
+    ;
+
+
+
+
+
+// Entry rule entryRuleTRANSLATABLEID
+entryRuleTRANSLATABLEID returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getTRANSLATABLEIDRule()); } 
+	 iv_ruleTRANSLATABLEID=ruleTRANSLATABLEID 
+	 { $current=$iv_ruleTRANSLATABLEID.current.getText(); }  
+	 EOF 
+;
+
+// Rule TRANSLATABLEID
+ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+    this_ID_0=RULE_ID    {
+		$current.merge(this_ID_0);
+    }
+
+    { 
+    newLeafNode(this_ID_0, grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); 
+    }
+
+    ;
+
+
+
+
+
+// Entry rule entryRuleSignedNumber
+entryRuleSignedNumber returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getSignedNumberRule()); } 
+	 iv_ruleSignedNumber=ruleSignedNumber 
+	 { $current=$iv_ruleSignedNumber.current.getText(); }  
+	 EOF 
+;
+
+// Rule SignedNumber
+ruleSignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+	kw='-' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0()); 
+    }
+)?
+    { 
+        newCompositeNode(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1()); 
+    }
+    this_UnsignedNumber_1=ruleUnsignedNumber    {
+		$current.merge(this_UnsignedNumber_1);
+    }
+
+    { 
+        afterParserOrEnumRuleCall();
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleUnsignedNumber
+entryRuleUnsignedNumber returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getUnsignedNumberRule()); } 
+	 iv_ruleUnsignedNumber=ruleUnsignedNumber 
+	 { $current=$iv_ruleUnsignedNumber.current.getText(); }  
+	 EOF 
+;
+
+// Rule UnsignedNumber
+ruleUnsignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(    this_INT_0=RULE_INT    {
+		$current.merge(this_INT_0);
+    }
+
+    { 
+    newLeafNode(this_INT_0, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0()); 
+    }
+(
+	kw='.' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0()); 
+    }
+    this_INT_2=RULE_INT    {
+		$current.merge(this_INT_2);
+    }
+
+    { 
+    newLeafNode(this_INT_2, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1()); 
+    }
+)?)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXAnnotation
+entryRuleXAnnotation returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXAnnotationRule()); }
+	 iv_ruleXAnnotation=ruleXAnnotation 
+	 { $current=$iv_ruleXAnnotation.current; } 
+	 EOF 
+;
+
+// Rule XAnnotation
+ruleXAnnotation returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
+            $current);
+    }
+)	otherlv_1='@' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
+    }
+(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXAnnotationRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0()); 
+	    }
+		ruleQualifiedName		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(((	'(' 
+)=>	otherlv_3='(' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
+    }
+)((((((
+(
+		ruleValidID
+)
+)	'=' 
+))=>
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0()); 
+	    }
+		lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+	        }
+       		add(
+       			$current, 
+       			"elementValuePairs",
+        		lv_elementValuePairs_4_0, 
+        		"XAnnotationElementValuePair");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_5=',' 
+    {
+    	newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
+    }
+((((
+(
+		ruleValidID
+)
+)	'=' 
+))=>
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0()); 
+	    }
+		lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+	        }
+       		add(
+       			$current, 
+       			"elementValuePairs",
+        		lv_elementValuePairs_6_0, 
+        		"XAnnotationElementValuePair");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+    |(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0()); 
+	    }
+		lv_value_7_0=ruleXAnnotationElementValueOrCommaList		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+	        }
+       		set(
+       			$current, 
+       			"value",
+        		lv_value_7_0, 
+        		"XAnnotationElementValueOrCommaList");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))?	otherlv_8=')' 
+    {
+    	newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
+    }
+)?)
+;
+
+
+
+
+
+// Entry rule entryRuleXAnnotationElementValuePair
+entryRuleXAnnotationElementValuePair returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); }
+	 iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair 
+	 { $current=$iv_ruleXAnnotationElementValuePair.current; } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValuePair
+ruleXAnnotationElementValuePair returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(((((
+(
+		ruleValidID
+)
+)	'=' 
+))=>((
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0()); 
+	    }
+		ruleValidID		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_1='=' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
+    }
+))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0()); 
+	    }
+		lv_value_2_0=ruleXAnnotationElementValue		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
+	        }
+       		set(
+       			$current, 
+       			"value",
+        		lv_value_2_0, 
+        		"XAnnotationElementValue");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleXAnnotationElementValueOrCommaList
+entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
+	 iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList 
+	 { $current=$iv_ruleXAnnotationElementValueOrCommaList.current; } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValueOrCommaList
+ruleXAnnotationElementValueOrCommaList returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((((((
+)	'#' 
+	'[' 
+))=>((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
+            $current);
+    }
+)	otherlv_1='#' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
+    }
+	otherlv_2='[' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
+    }
+))((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
+	    }
+		lv_elements_3_0=ruleXAnnotationOrExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_3_0, 
+        		"XAnnotationOrExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_4=',' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
+	    }
+		lv_elements_5_0=ruleXAnnotationOrExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_5_0, 
+        		"XAnnotationOrExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)?	otherlv_6=']' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
+    }
+)
+    |(
+    { 
+        newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); 
+    }
+    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
+    { 
+        $current = $this_XAnnotationOrExpression_7.current; 
+        afterParserOrEnumRuleCall();
+    }
+((
+    {
+        $current = forceCreateModelElementAndAdd(
+            grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
+            $current);
+    }
+)(	otherlv_9=',' 
+    {
+    	newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0()); 
+	    }
+		lv_elements_10_0=ruleXAnnotationOrExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_10_0, 
+        		"XAnnotationOrExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))+)?))
+;
+
+
+
+
+
+// Entry rule entryRuleXAnnotationElementValue
+entryRuleXAnnotationElementValue returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); }
+	 iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue 
+	 { $current=$iv_ruleXAnnotationElementValue.current; } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValue
+ruleXAnnotationElementValue returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((((((
+)	'#' 
+	'[' 
+))=>((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
+            $current);
+    }
+)	otherlv_1='#' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
+    }
+	otherlv_2='[' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
+    }
+))((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
+	    }
+		lv_elements_3_0=ruleXAnnotationOrExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_3_0, 
+        		"XAnnotationOrExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_4=',' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
+	    }
+		lv_elements_5_0=ruleXAnnotationOrExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_5_0, 
+        		"XAnnotationOrExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)?	otherlv_6=']' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
+    }
+)
+    |
+    { 
+        newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
+    }
+    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
+    { 
+        $current = $this_XAnnotationOrExpression_7.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleXAnnotationOrExpression
+entryRuleXAnnotationOrExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); }
+	 iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression 
+	 { $current=$iv_ruleXAnnotationOrExpression.current; } 
+	 EOF 
+;
+
+// Rule XAnnotationOrExpression
+ruleXAnnotationOrExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
+    }
+    this_XAnnotation_0=ruleXAnnotation
+    { 
+        $current = $this_XAnnotation_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
+    }
+    this_XExpression_1=ruleXExpression
+    { 
+        $current = $this_XExpression_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleXExpression
+entryRuleXExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXExpressionRule()); }
+	 iv_ruleXExpression=ruleXExpression 
+	 { $current=$iv_ruleXExpression.current; } 
+	 EOF 
+;
+
+// Rule XExpression
+ruleXExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+
+    { 
+        newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
+    }
+    this_XAssignment_0=ruleXAssignment
+    { 
+        $current = $this_XAssignment_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+;
+
+
+
+
+
+// Entry rule entryRuleXAssignment
+entryRuleXAssignment returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXAssignmentRule()); }
+	 iv_ruleXAssignment=ruleXAssignment 
+	 { $current=$iv_ruleXAssignment.current; } 
+	 EOF 
+;
+
+// Rule XAssignment
+ruleXAssignment returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXAssignmentRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
+	    }
+		ruleFeatureCallID		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)
+    { 
+        newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); 
+    }
+ruleOpSingleAssign
+    { 
+        afterParserOrEnumRuleCall();
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); 
+	    }
+		lv_value_3_0=ruleXAssignment		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAssignmentRule());
+	        }
+       		set(
+       			$current, 
+       			"value",
+        		lv_value_3_0, 
+        		"XAssignment");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+    |(
+    { 
+        newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); 
+    }
+    this_XOrExpression_4=ruleXOrExpression
+    { 
+        $current = $this_XOrExpression_4.current; 
+        afterParserOrEnumRuleCall();
+    }
+(((((
+)(
+(
+		ruleOpMultiAssign
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXAssignmentRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
+	    }
+		ruleOpMultiAssign		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); 
+	    }
+		lv_rightOperand_7_0=ruleXAssignment		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAssignmentRule());
+	        }
+       		set(
+       			$current, 
+       			"rightOperand",
+        		lv_rightOperand_7_0, 
+        		"XAssignment");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))?))
+;
+
+
+
+
+
+// Entry rule entryRuleOpSingleAssign
+entryRuleOpSingleAssign returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpSingleAssignRule()); } 
+	 iv_ruleOpSingleAssign=ruleOpSingleAssign 
+	 { $current=$iv_ruleOpSingleAssign.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpSingleAssign
+ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+
+	kw='=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
+    }
+
+    ;
+
+
+
+
+
+// Entry rule entryRuleOpMultiAssign
+entryRuleOpMultiAssign returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpMultiAssignRule()); } 
+	 iv_ruleOpMultiAssign=ruleOpMultiAssign 
+	 { $current=$iv_ruleOpMultiAssign.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpMultiAssign
+ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='+=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
+    }
+
+    |
+	kw='-=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
+    }
+
+    |
+	kw='*=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
+    }
+
+    |
+	kw='/=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
+    }
+
+    |
+	kw='%=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
+    }
+
+    |(
+	kw='<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); 
+    }
+
+	kw='<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); 
+    }
+
+	kw='=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); 
+    }
+)
+    |(
+	kw='>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); 
+    }
+(
+	kw='>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); 
+    }
+)?
+	kw='>=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); 
+    }
+))
+    ;
+
+
+
+
+
+// Entry rule entryRuleXOrExpression
+entryRuleXOrExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXOrExpressionRule()); }
+	 iv_ruleXOrExpression=ruleXOrExpression 
+	 { $current=$iv_ruleXOrExpression.current; } 
+	 EOF 
+;
+
+// Rule XOrExpression
+ruleXOrExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); 
+    }
+    this_XAndExpression_0=ruleXAndExpression
+    { 
+        $current = $this_XAndExpression_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+(((((
+)(
+(
+		ruleOpOr
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXOrExpressionRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+	    }
+		ruleOpOr		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); 
+	    }
+		lv_rightOperand_3_0=ruleXAndExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"rightOperand",
+        		lv_rightOperand_3_0, 
+        		"XAndExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
+// Entry rule entryRuleOpOr
+entryRuleOpOr returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpOrRule()); } 
+	 iv_ruleOpOr=ruleOpOr 
+	 { $current=$iv_ruleOpOr.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpOr
+ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+
+	kw='||' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
+    }
+
+    ;
+
+
+
+
+
+// Entry rule entryRuleXAndExpression
+entryRuleXAndExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXAndExpressionRule()); }
+	 iv_ruleXAndExpression=ruleXAndExpression 
+	 { $current=$iv_ruleXAndExpression.current; } 
+	 EOF 
+;
+
+// Rule XAndExpression
+ruleXAndExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); 
+    }
+    this_XEqualityExpression_0=ruleXEqualityExpression
+    { 
+        $current = $this_XEqualityExpression_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+(((((
+)(
+(
+		ruleOpAnd
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXAndExpressionRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+	    }
+		ruleOpAnd		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); 
+	    }
+		lv_rightOperand_3_0=ruleXEqualityExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"rightOperand",
+        		lv_rightOperand_3_0, 
+        		"XEqualityExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
+// Entry rule entryRuleOpAnd
+entryRuleOpAnd returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpAndRule()); } 
+	 iv_ruleOpAnd=ruleOpAnd 
+	 { $current=$iv_ruleOpAnd.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpAnd
+ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+
+	kw='&&' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
+    }
+
+    ;
+
+
+
+
+
+// Entry rule entryRuleXEqualityExpression
+entryRuleXEqualityExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXEqualityExpressionRule()); }
+	 iv_ruleXEqualityExpression=ruleXEqualityExpression 
+	 { $current=$iv_ruleXEqualityExpression.current; } 
+	 EOF 
+;
+
+// Rule XEqualityExpression
+ruleXEqualityExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); 
+    }
+    this_XRelationalExpression_0=ruleXRelationalExpression
+    { 
+        $current = $this_XRelationalExpression_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+(((((
+)(
+(
+		ruleOpEquality
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXEqualityExpressionRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+	    }
+		ruleOpEquality		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); 
+	    }
+		lv_rightOperand_3_0=ruleXRelationalExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"rightOperand",
+        		lv_rightOperand_3_0, 
+        		"XRelationalExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
+// Entry rule entryRuleOpEquality
+entryRuleOpEquality returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpEqualityRule()); } 
+	 iv_ruleOpEquality=ruleOpEquality 
+	 { $current=$iv_ruleOpEquality.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpEquality
+ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='==' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
+    }
+
+    |
+	kw='!=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
+    }
+
+    |
+	kw='===' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
+    }
+
+    |
+	kw='!==' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXRelationalExpression
+entryRuleXRelationalExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXRelationalExpressionRule()); }
+	 iv_ruleXRelationalExpression=ruleXRelationalExpression 
+	 { $current=$iv_ruleXRelationalExpression.current; } 
+	 EOF 
+;
+
+// Rule XRelationalExpression
+ruleXRelationalExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); 
+    }
+    this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression
+    { 
+        $current = $this_XOtherOperatorExpression_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+((((((
+)	'instanceof' 
+))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
+            $current);
+    }
+)	otherlv_2='instanceof' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
+    }
+))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); 
+	    }
+		lv_type_3_0=ruleJvmTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"type",
+        		lv_type_3_0, 
+        		"JvmTypeReference");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+    |(((((
+)(
+(
+		ruleOpCompare
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXRelationalExpressionRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
+	    }
+		ruleOpCompare		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); 
+	    }
+		lv_rightOperand_6_0=ruleXOtherOperatorExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"rightOperand",
+        		lv_rightOperand_6_0, 
+        		"XOtherOperatorExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))*)
+;
+
+
+
+
+
+// Entry rule entryRuleOpCompare
+entryRuleOpCompare returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpCompareRule()); } 
+	 iv_ruleOpCompare=ruleOpCompare 
+	 { $current=$iv_ruleOpCompare.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpCompare
+ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='>=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
+    }
+
+    |(
+	kw='<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); 
+    }
+
+	kw='=' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); 
+    }
+)
+    |
+	kw='>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
+    }
+
+    |
+	kw='<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXOtherOperatorExpression
+entryRuleXOtherOperatorExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); }
+	 iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression 
+	 { $current=$iv_ruleXOtherOperatorExpression.current; } 
+	 EOF 
+;
+
+// Rule XOtherOperatorExpression
+ruleXOtherOperatorExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); 
+    }
+    this_XAdditiveExpression_0=ruleXAdditiveExpression
+    { 
+        $current = $this_XAdditiveExpression_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+(((((
+)(
+(
+		ruleOpOther
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+	    }
+		ruleOpOther		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); 
+	    }
+		lv_rightOperand_3_0=ruleXAdditiveExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"rightOperand",
+        		lv_rightOperand_3_0, 
+        		"XAdditiveExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
+// Entry rule entryRuleOpOther
+entryRuleOpOther returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpOtherRule()); } 
+	 iv_ruleOpOther=ruleOpOther 
+	 { $current=$iv_ruleOpOther.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpOther
+ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='->' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
+    }
+
+    |
+	kw='..<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
+    }
+
+    |(
+	kw='>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); 
+    }
+
+	kw='..' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); 
+    }
+)
+    |
+	kw='..' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
+    }
+
+    |
+	kw='=>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
+    }
+
+    |(
+	kw='>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); 
+    }
+((((
+	'>' 
+
+	'>' 
+))=>(
+	kw='>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); 
+    }
+
+	kw='>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); 
+    }
+))
+    |
+	kw='>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
+    }
+))
+    |(
+	kw='<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); 
+    }
+((((
+	'<' 
+
+	'<' 
+))=>(
+	kw='<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); 
+    }
+
+	kw='<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); 
+    }
+))
+    |
+	kw='<' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
+    }
+
+    |
+	kw='=>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
+    }
+))
+    |
+	kw='<>' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
+    }
+
+    |
+	kw='?:' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXAdditiveExpression
+entryRuleXAdditiveExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); }
+	 iv_ruleXAdditiveExpression=ruleXAdditiveExpression 
+	 { $current=$iv_ruleXAdditiveExpression.current; } 
+	 EOF 
+;
+
+// Rule XAdditiveExpression
+ruleXAdditiveExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); 
+    }
+    this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression
+    { 
+        $current = $this_XMultiplicativeExpression_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+(((((
+)(
+(
+		ruleOpAdd
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+	    }
+		ruleOpAdd		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); 
+	    }
+		lv_rightOperand_3_0=ruleXMultiplicativeExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"rightOperand",
+        		lv_rightOperand_3_0, 
+        		"XMultiplicativeExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
+// Entry rule entryRuleOpAdd
+entryRuleOpAdd returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpAddRule()); } 
+	 iv_ruleOpAdd=ruleOpAdd 
+	 { $current=$iv_ruleOpAdd.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpAdd
+ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='+' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
+    }
+
+    |
+	kw='-' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXMultiplicativeExpression
+entryRuleXMultiplicativeExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); }
+	 iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression 
+	 { $current=$iv_ruleXMultiplicativeExpression.current; } 
+	 EOF 
+;
+
+// Rule XMultiplicativeExpression
+ruleXMultiplicativeExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); 
+    }
+    this_XUnaryOperation_0=ruleXUnaryOperation
+    { 
+        $current = $this_XUnaryOperation_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+(((((
+)(
+(
+		ruleOpMulti
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+	    }
+		ruleOpMulti		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); 
+	    }
+		lv_rightOperand_3_0=ruleXUnaryOperation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"rightOperand",
+        		lv_rightOperand_3_0, 
+        		"XUnaryOperation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
+// Entry rule entryRuleOpMulti
+entryRuleOpMulti returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpMultiRule()); } 
+	 iv_ruleOpMulti=ruleOpMulti 
+	 { $current=$iv_ruleOpMulti.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpMulti
+ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='*' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
+    }
+
+    |
+	kw='**' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
+    }
+
+    |
+	kw='/' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
+    }
+
+    |
+	kw='%' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXUnaryOperation
+entryRuleXUnaryOperation returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXUnaryOperationRule()); }
+	 iv_ruleXUnaryOperation=ruleXUnaryOperation 
+	 { $current=$iv_ruleXUnaryOperation.current; } 
+	 EOF 
+;
+
+// Rule XUnaryOperation
+ruleXUnaryOperation returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXUnaryOperationRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
+	    }
+		ruleOpUnary		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); 
+	    }
+		lv_operand_2_0=ruleXUnaryOperation		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
+	        }
+       		set(
+       			$current, 
+       			"operand",
+        		lv_operand_2_0, 
+        		"XUnaryOperation");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+    |
+    { 
+        newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
+    }
+    this_XCastedExpression_3=ruleXCastedExpression
+    { 
+        $current = $this_XCastedExpression_3.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleOpUnary
+entryRuleOpUnary returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpUnaryRule()); } 
+	 iv_ruleOpUnary=ruleOpUnary 
+	 { $current=$iv_ruleOpUnary.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpUnary
+ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='!' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
+    }
+
+    |
+	kw='-' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
+    }
+
+    |
+	kw='+' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXCastedExpression
+entryRuleXCastedExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXCastedExpressionRule()); }
+	 iv_ruleXCastedExpression=ruleXCastedExpression 
+	 { $current=$iv_ruleXCastedExpression.current; } 
+	 EOF 
+;
+
+// Rule XCastedExpression
+ruleXCastedExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); 
+    }
+    this_XPostfixOperation_0=ruleXPostfixOperation
+    { 
+        $current = $this_XPostfixOperation_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+(((((
+)	'as' 
+))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
+            $current);
+    }
+)	otherlv_2='as' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
+    }
+))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); 
+	    }
+		lv_type_3_0=ruleJvmTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
+	        }
+       		set(
+       			$current, 
+       			"type",
+        		lv_type_3_0, 
+        		"JvmTypeReference");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
+// Entry rule entryRuleXPostfixOperation
+entryRuleXPostfixOperation returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXPostfixOperationRule()); }
+	 iv_ruleXPostfixOperation=ruleXPostfixOperation 
+	 { $current=$iv_ruleXPostfixOperation.current; } 
+	 EOF 
+;
+
+// Rule XPostfixOperation
+ruleXPostfixOperation returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); 
+    }
+    this_XMemberFeatureCall_0=ruleXMemberFeatureCall
+    { 
+        $current = $this_XMemberFeatureCall_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+((((
+)(
+(
+		ruleOpPostfix
+)
+)))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
+            $current);
+    }
+)(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXPostfixOperationRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); 
+	    }
+		ruleOpPostfix		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)))?)
+;
+
+
+
+
+
+// Entry rule entryRuleOpPostfix
+entryRuleOpPostfix returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getOpPostfixRule()); } 
+	 iv_ruleOpPostfix=ruleOpPostfix 
+	 { $current=$iv_ruleOpPostfix.current.getText(); }  
+	 EOF 
+;
+
+// Rule OpPostfix
+ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='++' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
+    }
+
+    |
+	kw='--' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXMemberFeatureCall
+entryRuleXMemberFeatureCall returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); }
+	 iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall 
+	 { $current=$iv_ruleXMemberFeatureCall.current; } 
+	 EOF 
+;
+
+// Rule XMemberFeatureCall
+ruleXMemberFeatureCall returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); 
+    }
+    this_XPrimaryExpression_0=ruleXPrimaryExpression
+    { 
+        $current = $this_XPrimaryExpression_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+((((((
+)(	'.' 
+
+    |(
+(
+	'::' 
+ 
+
+)
+))(
+(
+		ruleFeatureCallID
+)
+)	ruleOpSingleAssign))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
+            $current);
+    }
+)(	otherlv_2='.' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
+    }
+
+    |(
+(
+		lv_explicitStatic_3_0=	'::' 
+    {
+        newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		setWithLastConsumed($current, "explicitStatic", true, "::");
+	    }
+
+)
+))(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); 
+	    }
+		ruleFeatureCallID		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)
+    { 
+        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); 
+    }
+ruleOpSingleAssign
+    { 
+        afterParserOrEnumRuleCall();
+    }
+))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); 
+	    }
+		lv_value_6_0=ruleXAssignment		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		set(
+       			$current, 
+       			"value",
+        		lv_value_6_0, 
+        		"XAssignment");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+    |(((((
+)(	'.' 
+
+    |(
+(
+	'?.' 
+ 
+
+)
+)
+    |(
+(
+	'::' 
+ 
+
+)
+))))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
+            $current);
+    }
+)(	otherlv_8='.' 
+    {
+    	newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
+    }
+
+    |(
+(
+		lv_nullSafe_9_0=	'?.' 
+    {
+        newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		setWithLastConsumed($current, "nullSafe", true, "?.");
+	    }
+
+)
+)
+    |(
+(
+		lv_explicitStatic_10_0=	'::' 
+    {
+        newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		setWithLastConsumed($current, "explicitStatic", true, "::");
+	    }
+
+)
+))))(	otherlv_11='<' 
+    {
+    	newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); 
+	    }
+		lv_typeArguments_12_0=ruleJvmArgumentTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		add(
+       			$current, 
+       			"typeArguments",
+        		lv_typeArguments_12_0, 
+        		"JvmArgumentTypeReference");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_13=',' 
+    {
+    	newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); 
+	    }
+		lv_typeArguments_14_0=ruleJvmArgumentTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		add(
+       			$current, 
+       			"typeArguments",
+        		lv_typeArguments_14_0, 
+        		"JvmArgumentTypeReference");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*	otherlv_15='>' 
+    {
+    	newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
+    }
+)?(
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); 
+	    }
+		ruleIdOrSuper		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(((
+(
+	'(' 
+ 
+
+)
+)=>
+(
+		lv_explicitOperationCall_17_0=	'(' 
+    {
+        newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		setWithLastConsumed($current, "explicitOperationCall", true, "(");
+	    }
+
+)
+)(((((
+)((
+(
+ruleJvmFormalParameter
+)
+)(	',' 
+(
+(
+ruleJvmFormalParameter
+)
+))*)?(
+(
+	'|' 
+ 
+
+)
+)))=>
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); 
+	    }
+		lv_memberCallArguments_18_0=ruleXShortClosure		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		add(
+       			$current, 
+       			"memberCallArguments",
+        		lv_memberCallArguments_18_0, 
+        		"XShortClosure");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)
+    |((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); 
+	    }
+		lv_memberCallArguments_19_0=ruleXExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		add(
+       			$current, 
+       			"memberCallArguments",
+        		lv_memberCallArguments_19_0, 
+        		"XExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_20=',' 
+    {
+    	newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); 
+	    }
+		lv_memberCallArguments_21_0=ruleXExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		add(
+       			$current, 
+       			"memberCallArguments",
+        		lv_memberCallArguments_21_0, 
+        		"XExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*))?	otherlv_22=')' 
+    {
+    	newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
+    }
+)?((((
+)	'[' 
+))=>
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); 
+	    }
+		lv_memberCallArguments_23_0=ruleXClosure		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+	        }
+       		add(
+       			$current, 
+       			"memberCallArguments",
+        		lv_memberCallArguments_23_0, 
+        		"XClosure");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)?))*)
+;
+
+
+
+
+
+// Entry rule entryRuleXPrimaryExpression
+entryRuleXPrimaryExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); }
+	 iv_ruleXPrimaryExpression=ruleXPrimaryExpression 
+	 { $current=$iv_ruleXPrimaryExpression.current; } 
+	 EOF 
+;
+
+// Rule XPrimaryExpression
+ruleXPrimaryExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); 
+    }
+    this_XConstructorCall_0=ruleXConstructorCall
+    { 
+        $current = $this_XConstructorCall_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); 
+    }
+    this_XBlockExpression_1=ruleXBlockExpression
+    { 
+        $current = $this_XBlockExpression_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); 
+    }
+    this_XSwitchExpression_2=ruleXSwitchExpression
+    { 
+        $current = $this_XSwitchExpression_2.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |((((
+)	'synchronized' 
+	'(' 
+))=>
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); 
+    }
+    this_XSynchronizedExpression_3=ruleXSynchronizedExpression
+    { 
+        $current = $this_XSynchronizedExpression_3.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); 
+    }
+    this_XFeatureCall_4=ruleXFeatureCall
+    { 
+        $current = $this_XFeatureCall_4.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); 
+    }
+    this_XLiteral_5=ruleXLiteral
+    { 
+        $current = $this_XLiteral_5.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); 
+    }
+    this_XIfExpression_6=ruleXIfExpression
+    { 
+        $current = $this_XIfExpression_6.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |((((
+)	'for' 
+	'(' 
+(
+(
+ruleJvmFormalParameter
+)
+)	':' 
+))=>
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
+    }
+    this_XForLoopExpression_7=ruleXForLoopExpression
+    { 
+        $current = $this_XForLoopExpression_7.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
+    }
+    this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression
+    { 
+        $current = $this_XBasicForLoopExpression_8.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); 
+    }
+    this_XWhileExpression_9=ruleXWhileExpression
+    { 
+        $current = $this_XWhileExpression_9.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); 
+    }
+    this_XDoWhileExpression_10=ruleXDoWhileExpression
+    { 
+        $current = $this_XDoWhileExpression_10.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); 
+    }
+    this_XThrowExpression_11=ruleXThrowExpression
+    { 
+        $current = $this_XThrowExpression_11.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); 
+    }
+    this_XReturnExpression_12=ruleXReturnExpression
+    { 
+        $current = $this_XReturnExpression_12.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); 
+    }
+    this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression
+    { 
+        $current = $this_XTryCatchFinallyExpression_13.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); 
+    }
+    this_XParenthesizedExpression_14=ruleXParenthesizedExpression
+    { 
+        $current = $this_XParenthesizedExpression_14.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleXLiteral
+entryRuleXLiteral returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXLiteralRule()); }
+	 iv_ruleXLiteral=ruleXLiteral 
+	 { $current=$iv_ruleXLiteral.current; } 
+	 EOF 
+;
+
+// Rule XLiteral
+ruleXLiteral returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); 
+    }
+    this_XCollectionLiteral_0=ruleXCollectionLiteral
+    { 
+        $current = $this_XCollectionLiteral_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |((((
+)	'[' 
+))=>
+    { 
+        newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); 
+    }
+    this_XClosure_1=ruleXClosure
+    { 
+        $current = $this_XClosure_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+    |
+    { 
+        newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); 
+    }
+    this_XBooleanLiteral_2=ruleXBooleanLiteral
+    { 
+        $current = $this_XBooleanLiteral_2.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); 
+    }
+    this_XNumberLiteral_3=ruleXNumberLiteral
+    { 
+        $current = $this_XNumberLiteral_3.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); 
+    }
+    this_XNullLiteral_4=ruleXNullLiteral
+    { 
+        $current = $this_XNullLiteral_4.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); 
+    }
+    this_XStringLiteral_5=ruleXStringLiteral
+    { 
+        $current = $this_XStringLiteral_5.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); 
+    }
+    this_XTypeLiteral_6=ruleXTypeLiteral
+    { 
+        $current = $this_XTypeLiteral_6.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleXCollectionLiteral
+entryRuleXCollectionLiteral returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXCollectionLiteralRule()); }
+	 iv_ruleXCollectionLiteral=ruleXCollectionLiteral 
+	 { $current=$iv_ruleXCollectionLiteral.current; } 
+	 EOF 
+;
+
+// Rule XCollectionLiteral
+ruleXCollectionLiteral returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); 
+    }
+    this_XSetLiteral_0=ruleXSetLiteral
+    { 
+        $current = $this_XSetLiteral_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); 
+    }
+    this_XListLiteral_1=ruleXListLiteral
+    { 
+        $current = $this_XListLiteral_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleXSetLiteral
+entryRuleXSetLiteral returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXSetLiteralRule()); }
+	 iv_ruleXSetLiteral=ruleXSetLiteral 
+	 { $current=$iv_ruleXSetLiteral.current; } 
+	 EOF 
+;
+
+// Rule XSetLiteral
+ruleXSetLiteral returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
+            $current);
+    }
+)	otherlv_1='#' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
+    }
+	otherlv_2='{' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
+    }
+((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
+	    }
+		lv_elements_3_0=ruleXExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_3_0, 
+        		"XExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_4=',' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
+	    }
+		lv_elements_5_0=ruleXExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_5_0, 
+        		"XExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)?	otherlv_6='}' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleXListLiteral
+entryRuleXListLiteral returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXListLiteralRule()); }
+	 iv_ruleXListLiteral=ruleXListLiteral 
+	 { $current=$iv_ruleXListLiteral.current; } 
+	 EOF 
+;
+
+// Rule XListLiteral
+ruleXListLiteral returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
+            $current);
+    }
+)	otherlv_1='#' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
+    }
+	otherlv_2='[' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
+    }
+((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
+	    }
+		lv_elements_3_0=ruleXExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXListLiteralRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_3_0, 
+        		"XExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_4=',' 
+    {
+    	newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
+	    }
+		lv_elements_5_0=ruleXExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXListLiteralRule());
+	        }
+       		add(
+       			$current, 
+       			"elements",
+        		lv_elements_5_0, 
+        		"XExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)?	otherlv_6=']' 
+    {
+    	newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleXClosure
+entryRuleXClosure returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXClosureRule()); }
+	 iv_ruleXClosure=ruleXClosure 
+	 { $current=$iv_ruleXClosure.current; } 
+	 EOF 
+;
+
+// Rule XClosure
+ruleXClosure returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(((((
+)	'[' 
+))=>((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
+            $current);
+    }
+)	otherlv_1='[' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
+    }
+))(((((
+(
+ruleJvmFormalParameter
+)
+)(	',' 
+(
+(
+ruleJvmFormalParameter
+)
+))*)?(
+(
+	'|' 
+ 
+
+)
+)))=>(((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0()); 
+	    }
+		lv_declaredFormalParameters_2_0=ruleJvmFormalParameter		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXClosureRule());
+	        }
+       		add(
+       			$current, 
+       			"declaredFormalParameters",
+        		lv_declaredFormalParameters_2_0, 
+        		"JvmFormalParameter");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_3=',' 
+    {
+    	newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0()); 
+	    }
+		lv_declaredFormalParameters_4_0=ruleJvmFormalParameter		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXClosureRule());
+	        }
+       		add(
+       			$current, 
+       			"declaredFormalParameters",
+        		lv_declaredFormalParameters_4_0, 
+        		"JvmFormalParameter");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)?(
+(
+		lv_explicitSyntax_5_0=	'|' 
+    {
+        newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXClosureRule());
+	        }
+       		setWithLastConsumed($current, "explicitSyntax", true, "|");
+	    }
+
+)
+)))?(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0()); 
+	    }
+		lv_expression_6_0=ruleXExpressionInClosure		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXClosureRule());
+	        }
+       		set(
+       			$current, 
+       			"expression",
+        		lv_expression_6_0, 
+        		"XExpressionInClosure");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)	otherlv_7=']' 
+    {
+    	newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleXExpressionInClosure
+entryRuleXExpressionInClosure returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXExpressionInClosureRule()); }
+	 iv_ruleXExpressionInClosure=ruleXExpressionInClosure 
+	 { $current=$iv_ruleXExpressionInClosure.current; } 
+	 EOF 
+;
+
+// Rule XExpressionInClosure
+ruleXExpressionInClosure returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
+            $current);
+    }
+)((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0()); 
+	    }
+		lv_expressions_1_0=ruleXExpressionOrVarDeclaration		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
+	        }
+       		add(
+       			$current, 
+       			"expressions",
+        		lv_expressions_1_0, 
+        		"XExpressionOrVarDeclaration");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_2=';' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
+    }
+)?)*)
+;
+
+
+
+
+
+// Entry rule entryRuleXShortClosure
+entryRuleXShortClosure returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXShortClosureRule()); }
+	 iv_ruleXShortClosure=ruleXShortClosure 
+	 { $current=$iv_ruleXShortClosure.current; } 
+	 EOF 
+;
+
+// Rule XShortClosure
+ruleXShortClosure returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(((((
+)((
+(
+ruleJvmFormalParameter
+)
+)(	',' 
+(
+(
+ruleJvmFormalParameter
+)
+))*)?(
+(
+	'|' 
+ 
+
+)
+)))=>((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
+            $current);
+    }
+)((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0()); 
+	    }
+		lv_declaredFormalParameters_1_0=ruleJvmFormalParameter		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+	        }
+       		add(
+       			$current, 
+       			"declaredFormalParameters",
+        		lv_declaredFormalParameters_1_0, 
+        		"JvmFormalParameter");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_2=',' 
+    {
+    	newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0()); 
+	    }
+		lv_declaredFormalParameters_3_0=ruleJvmFormalParameter		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+	        }
+       		add(
+       			$current, 
+       			"declaredFormalParameters",
+        		lv_declaredFormalParameters_3_0, 
+        		"JvmFormalParameter");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)?(
+(
+		lv_explicitSyntax_4_0=	'|' 
+    {
+        newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
+    }
+ 
+	    {
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getXShortClosureRule());
+	        }
+       		setWithLastConsumed($current, "explicitSyntax", true, "|");
+	    }
+
+)
+)))(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0()); 
+	    }
+		lv_expression_5_0=ruleXExpression		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+	        }
+       		set(
+       			$current, 
+       			"expression",
+        		lv_expression_5_0, 
+        		"XExpression");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleXParenthesizedExpression
+entryRuleXParenthesizedExpression returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); }
+	 iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression 
+	 { $current=$iv_ruleXParenthesizedExpression.current; } 
+	 EOF 
+;
+
+// Rule XParenthesizedExpression
+ruleXParenthesizedExpression returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='(' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
+    }
+
+    { 
+        newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1()); 
+    }
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.tokens b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.tokens
new file mode 100644
index 0000000..996b04c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.tokens
@@ -0,0 +1,525 @@
+'!'=155
+'!='=142
+'!=='=144
+'#'=128
+'%'=154
+'%='=135
+'&&'=140
+'&'=190
+'('=84
+')'=85
+'*'=125
+'**'=152
+'*='=133
+'+'=97
+'++'=157
+'+='=131
+','=99
+'-'=126
+'--'=158
+'-='=132
+'->'=146
+'.'=93
+'..'=148
+'..<'=147
+'/'=153
+'/='=134
+':'=166
+'::'=159
+';'=162
+'<'=136
+'<>'=150
+'='=127
+'=='=141
+'==='=143
+'=>'=149
+'>'=137
+'>='=138
+'?'=189
+'?.'=160
+'?:'=151
+'@'=29
+'Boolean'=191
+'Date'=196
+'Double'=194
+'Integer'=192
+'Long'=193
+'String'=195
+'SuggestText'=197
+'['=129
+']'=130
+'actions'=33
+'and'=30
+'as'=156
+'assistive'=217
+'aztec'=269
+'barcodeType'=62
+'blink'=225
+'blinkRate'=35
+'blinkreverse'=234
+'block'=220
+'button'=118
+'caption'=88
+'case'=168
+'cashDrawer'=115
+'catch'=188
+'clear'=101
+'clearDevice'=36
+'code128'=246
+'code128_parsed'=259
+'code39'=244
+'code93'=245
+'codeabar'=243
+'column'=39
+'configuration'=77
+'controls'=22
+'createWindow'=37
+'cursorType'=44
+'data'=61
+'dataProvider'=111
+'datamatrix'=266
+'default'=167
+'delay'=122
+'described by'=17
+'description'=89
+'destroyWindow'=45
+'deviceBrightness'=46
+'displayBitmap'=47
+'displayText'=49
+'displayTextAt'=52
+'do'=171
+'down'=227
+'dto'=96
+'ean128'=256
+'ean13'=240
+'ean13_s'=255
+'ean8'=238
+'ean8_s'=254
+'else'=164
+'error'=215
+'event'=24
+'events'=21
+'extends'=174
+'extension'=176
+'false'=179
+'field'=120
+'fields'=110
+'finally'=186
+'fixed'=219
+'for'=169
+'from'=81
+'function'=90
+'functiongroup'=18
+'get'=98
+'getBrowserLocale'=204
+'getIPAddress'=199
+'getNow'=200
+'getSceenWidth'=210
+'getScreenHeight'=211
+'getTrigger'=212
+'getUserAgentInfo'=201
+'getUserEmail'=207
+'getUserName'=205
+'getUserPassword'=206
+'getUserPosition'=208
+'getUserPrintService'=209
+'gs1databar'=260
+'gs1databar_e'=261
+'gs1databar_e_s'=263
+'gs1databar_s'=262
+'guard'=86
+'guards'=32
+'halfblock'=221
+'height'=40
+'host'=69
+'humanized'=213
+'id'=48
+'identity'=27
+'if'=163
+'image'=105
+'import'=124
+'in'=107
+'init'=230
+'initialEvent'=20
+'initialState'=19
+'instanceof'=145
+'interCharacterWait'=53
+'invisible'=104
+'isHttps'=203
+'isTouchDevice'=202
+'itf'=242
+'jan13'=239
+'jan8'=237
+'key'=119
+'keyboard'=198
+'keypad'=109
+'keystroke'=28
+'layout'=121
+'left'=228
+'lineDisplay'=113
+'marqueeFormat'=54
+'marqueeRepeatWait'=55
+'marqueeType'=56
+'marqueeUnitWait'=57
+'maxicode'=265
+'name'=67
+'new'=178
+'none'=218
+'normal'=233
+'null'=181
+'ocrb'=258
+'ofAmount'=79
+'ofReceipt'=75
+'onFail'=87
+'openDrawer'=59
+'operation'=83
+'orca'=257
+'other'=224
+'package'=13
+'payment'=116
+'paymentAcknowledge'=72
+'paymentAuthorization'=78
+'paymentClose'=71
+'paymentOpen'=68
+'paymentRegistration'=76
+'paymentResponse'=80
+'paymentReversal'=73
+'pdf417'=264
+'peripheral'=117
+'place'=232
+'port'=70
+'posPrinter'=114
+'printBarcode'=60
+'printBitmap'=63
+'printCut'=64
+'printNormal'=65
+'printReport'=82
+'qrcode'=267
+'registerBitmap'=66
+'remove'=102
+'retrieve'=94
+'return'=184
+'reverse'=223
+'right'=229
+'row'=38
+'schedule'=108
+'scheduler'=112
+'scroll'=58
+'search'=106
+'send'=123
+'set'=100
+'state'=25
+'statemachine'=16
+'states'=23
+'static'=175
+'store'=91
+'super'=177
+'switch'=165
+'synchronized'=187
+'text'=50
+'tf'=241
+'throw'=183
+'transition'=34
+'translate'=95
+'tray'=216
+'trigger'=31
+'triggers'=26
+'true'=180
+'try'=185
+'type'=51
+'typeof'=182
+'underline'=222
+'up'=226
+'upca'=235
+'upca_s'=247
+'upcb'=236
+'upcd1'=249
+'upcd2'=250
+'upcd3'=251
+'upcd4'=252
+'upcd5'=253
+'upce_s'=248
+'updf417'=270
+'uqrcode'=268
+'val'=173
+'var'=172
+'visible'=103
+'walk'=231
+'warning'=214
+'while'=170
+'width'=41
+'windowHeight'=42
+'windowWidth'=43
+'with'=92
+'withPassword'=74
+'{'=14
+'|'=161
+'||'=139
+'}'=15
+RULE_ANY_OTHER=12
+RULE_DECIMAL=8
+RULE_HEX=7
+RULE_ID=4
+RULE_INT=5
+RULE_ML_COMMENT=9
+RULE_SL_COMMENT=10
+RULE_STRING=6
+RULE_WS=11
+T__100=100
+T__101=101
+T__102=102
+T__103=103
+T__104=104
+T__105=105
+T__106=106
+T__107=107
+T__108=108
+T__109=109
+T__110=110
+T__111=111
+T__112=112
+T__113=113
+T__114=114
+T__115=115
+T__116=116
+T__117=117
+T__118=118
+T__119=119
+T__120=120
+T__121=121
+T__122=122
+T__123=123
+T__124=124
+T__125=125
+T__126=126
+T__127=127
+T__128=128
+T__129=129
+T__130=130
+T__131=131
+T__132=132
+T__133=133
+T__134=134
+T__135=135
+T__136=136
+T__137=137
+T__138=138
+T__139=139
+T__13=13
+T__140=140
+T__141=141
+T__142=142
+T__143=143
+T__144=144
+T__145=145
+T__146=146
+T__147=147
+T__148=148
+T__149=149
+T__14=14
+T__150=150
+T__151=151
+T__152=152
+T__153=153
+T__154=154
+T__155=155
+T__156=156
+T__157=157
+T__158=158
+T__159=159
+T__15=15
+T__160=160
+T__161=161
+T__162=162
+T__163=163
+T__164=164
+T__165=165
+T__166=166
+T__167=167
+T__168=168
+T__169=169
+T__16=16
+T__170=170
+T__171=171
+T__172=172
+T__173=173
+T__174=174
+T__175=175
+T__176=176
+T__177=177
+T__178=178
+T__179=179
+T__17=17
+T__180=180
+T__181=181
+T__182=182
+T__183=183
+T__184=184
+T__185=185
+T__186=186
+T__187=187
+T__188=188
+T__189=189
+T__18=18
+T__190=190
+T__191=191
+T__192=192
+T__193=193
+T__194=194
+T__195=195
+T__196=196
+T__197=197
+T__198=198
+T__199=199
+T__19=19
+T__200=200
+T__201=201
+T__202=202
+T__203=203
+T__204=204
+T__205=205
+T__206=206
+T__207=207
+T__208=208
+T__209=209
+T__20=20
+T__210=210
+T__211=211
+T__212=212
+T__213=213
+T__214=214
+T__215=215
+T__216=216
+T__217=217
+T__218=218
+T__219=219
+T__21=21
+T__220=220
+T__221=221
+T__222=222
+T__223=223
+T__224=224
+T__225=225
+T__226=226
+T__227=227
+T__228=228
+T__229=229
+T__22=22
+T__230=230
+T__231=231
+T__232=232
+T__233=233
+T__234=234
+T__235=235
+T__236=236
+T__237=237
+T__238=238
+T__239=239
+T__23=23
+T__240=240
+T__241=241
+T__242=242
+T__243=243
+T__244=244
+T__245=245
+T__246=246
+T__247=247
+T__248=248
+T__249=249
+T__24=24
+T__250=250
+T__251=251
+T__252=252
+T__253=253
+T__254=254
+T__255=255
+T__256=256
+T__257=257
+T__258=258
+T__259=259
+T__25=25
+T__260=260
+T__261=261
+T__262=262
+T__263=263
+T__264=264
+T__265=265
+T__266=266
+T__267=267
+T__268=268
+T__269=269
+T__26=26
+T__270=270
+T__27=27
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
+T__54=54
+T__55=55
+T__56=56
+T__57=57
+T__58=58
+T__59=59
+T__60=60
+T__61=61
+T__62=62
+T__63=63
+T__64=64
+T__65=65
+T__66=66
+T__67=67
+T__68=68
+T__69=69
+T__70=70
+T__71=71
+T__72=72
+T__73=73
+T__74=74
+T__75=75
+T__76=76
+T__77=77
+T__78=78
+T__79=79
+T__80=80
+T__81=81
+T__82=82
+T__83=83
+T__84=84
+T__85=85
+T__86=86
+T__87=87
+T__88=88
+T__89=89
+T__90=90
+T__91=91
+T__92=92
+T__93=93
+T__94=94
+T__95=95
+T__96=96
+T__97=97
+T__98=98
+T__99=99
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSLLexer.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSLLexer.java
new file mode 100644
index 0000000..40d39d6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSLLexer.java
@@ -0,0 +1,10014 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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 InternalStatemachineDSLLexer extends Lexer {
+    public static final int T__144=144;
+    public static final int T__265=265;
+    public static final int T__143=143;
+    public static final int T__264=264;
+    public static final int T__146=146;
+    public static final int T__267=267;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__266=266;
+    public static final int T__140=140;
+    public static final int T__261=261;
+    public static final int T__260=260;
+    public static final int T__142=142;
+    public static final int T__263=263;
+    public static final int T__141=141;
+    public static final int T__262=262;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__258=258;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__257=257;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__259=259;
+    public static final int T__133=133;
+    public static final int T__254=254;
+    public static final int T__132=132;
+    public static final int T__253=253;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__256=256;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int T__255=255;
+    public static final int T__250=250;
+    public static final int RULE_ID=4;
+    public static final int T__131=131;
+    public static final int T__252=252;
+    public static final int T__130=130;
+    public static final int T__251=251;
+    public static final int RULE_INT=5;
+    public static final int T__66=66;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__247=247;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__246=246;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__249=249;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__248=248;
+    public static final int T__166=166;
+    public static final int T__165=165;
+    public static final int T__168=168;
+    public static final int T__167=167;
+    public static final int T__162=162;
+    public static final int T__161=161;
+    public static final int T__164=164;
+    public static final int T__163=163;
+    public static final int T__160=160;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__159=159;
+    public static final int T__30=30;
+    public static final int T__158=158;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__154=154;
+    public static final int T__157=157;
+    public static final int T__156=156;
+    public static final int T__151=151;
+    public static final int T__150=150;
+    public static final int T__153=153;
+    public static final int T__152=152;
+    public static final int T__270=270;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__269=269;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__268=268;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__100=100;
+    public static final int T__221=221;
+    public static final int T__220=220;
+    public static final int T__102=102;
+    public static final int T__223=223;
+    public static final int T__101=101;
+    public static final int T__222=222;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__218=218;
+    public static final int T__217=217;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__219=219;
+    public static final int T__214=214;
+    public static final int T__213=213;
+    public static final int T__216=216;
+    public static final int T__215=215;
+    public static final int T__210=210;
+    public static final int T__212=212;
+    public static final int T__211=211;
+    public static final int RULE_DECIMAL=8;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__207=207;
+    public static final int T__23=23;
+    public static final int T__206=206;
+    public static final int T__24=24;
+    public static final int T__209=209;
+    public static final int T__25=25;
+    public static final int T__208=208;
+    public static final int T__203=203;
+    public static final int T__202=202;
+    public static final int T__20=20;
+    public static final int T__205=205;
+    public static final int T__21=21;
+    public static final int T__204=204;
+    public static final int T__122=122;
+    public static final int T__243=243;
+    public static final int T__121=121;
+    public static final int T__242=242;
+    public static final int T__124=124;
+    public static final int T__245=245;
+    public static final int T__123=123;
+    public static final int T__244=244;
+    public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__119=119;
+    public static final int T__118=118;
+    public static final int T__239=239;
+    public static final int T__115=115;
+    public static final int T__236=236;
+    public static final int EOF=-1;
+    public static final int T__114=114;
+    public static final int T__235=235;
+    public static final int T__117=117;
+    public static final int T__238=238;
+    public static final int T__116=116;
+    public static final int T__237=237;
+    public static final int T__111=111;
+    public static final int T__232=232;
+    public static final int T__110=110;
+    public static final int T__231=231;
+    public static final int T__113=113;
+    public static final int T__234=234;
+    public static final int T__112=112;
+    public static final int T__233=233;
+    public static final int T__230=230;
+    public static final int T__108=108;
+    public static final int T__229=229;
+    public static final int T__107=107;
+    public static final int T__228=228;
+    public static final int T__109=109;
+    public static final int T__104=104;
+    public static final int T__225=225;
+    public static final int T__103=103;
+    public static final int T__224=224;
+    public static final int T__106=106;
+    public static final int T__227=227;
+    public static final int T__105=105;
+    public static final int T__226=226;
+    public static final int RULE_HEX=7;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__201=201;
+    public static final int T__200=200;
+    public static final int T__91=91;
+    public static final int T__188=188;
+    public static final int T__92=92;
+    public static final int T__187=187;
+    public static final int T__93=93;
+    public static final int T__94=94;
+    public static final int T__189=189;
+    public static final int T__184=184;
+    public static final int T__183=183;
+    public static final int T__186=186;
+    public static final int T__90=90;
+    public static final int T__185=185;
+    public static final int T__180=180;
+    public static final int T__182=182;
+    public static final int T__181=181;
+    public static final int T__99=99;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
+    public static final int T__169=169;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=6;
+    public static final int T__77=77;
+    public static final int T__78=78;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__74=74;
+    public static final int T__75=75;
+    public static final int T__76=76;
+    public static final int T__80=80;
+    public static final int T__199=199;
+    public static final int T__81=81;
+    public static final int T__198=198;
+    public static final int T__82=82;
+    public static final int T__83=83;
+    public static final int T__195=195;
+    public static final int T__194=194;
+    public static final int RULE_WS=11;
+    public static final int T__197=197;
+    public static final int T__196=196;
+    public static final int T__191=191;
+    public static final int T__190=190;
+    public static final int T__193=193;
+    public static final int T__192=192;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__89=89;
+    public static final int T__84=84;
+    public static final int T__85=85;
+    public static final int T__86=86;
+    public static final int T__87=87;
+
+    // delegates
+    // delegators
+
+    public InternalStatemachineDSLLexer() {;} 
+    public InternalStatemachineDSLLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalStatemachineDSLLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:11:7: ( 'package' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:11:9: 'package'
+            {
+            match("package"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:12:7: ( '{' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13:7: ( '}' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:14:7: ( 'statemachine' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:14:9: 'statemachine'
+            {
+            match("statemachine"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:15:7: ( 'described by' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:15:9: 'described by'
+            {
+            match("described by"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:16:7: ( 'functiongroup' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:16:9: 'functiongroup'
+            {
+            match("functiongroup"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:17:7: ( 'initialState' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:17:9: 'initialState'
+            {
+            match("initialState"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:18:7: ( 'initialEvent' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:18:9: 'initialEvent'
+            {
+            match("initialEvent"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:19:7: ( 'events' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:19:9: 'events'
+            {
+            match("events"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:20:7: ( 'controls' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:20:9: 'controls'
+            {
+            match("controls"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:21:7: ( 'states' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:21:9: 'states'
+            {
+            match("states"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:22:7: ( 'event' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:22:9: 'event'
+            {
+            match("event"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:23:7: ( 'state' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:23:9: 'state'
+            {
+            match("state"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:24:7: ( 'triggers' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:24:9: 'triggers'
+            {
+            match("triggers"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:25:7: ( 'identity' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:25:9: 'identity'
+            {
+            match("identity"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:26:7: ( 'keystroke' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:26:9: 'keystroke'
+            {
+            match("keystroke"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:27:7: ( '@' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:27:9: '@'
+            {
+            match('@'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__29"
+
+    // $ANTLR start "T__30"
+    public final void mT__30() throws RecognitionException {
+        try {
+            int _type = T__30;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:28:7: ( 'and' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:28:9: 'and'
+            {
+            match("and"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:29:7: ( 'trigger' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:29:9: 'trigger'
+            {
+            match("trigger"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:30:7: ( 'guards' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:30:9: 'guards'
+            {
+            match("guards"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:31:7: ( 'actions' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:31:9: 'actions'
+            {
+            match("actions"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:32:7: ( 'transition' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:32:9: 'transition'
+            {
+            match("transition"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:33:7: ( 'blinkRate' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:33:9: 'blinkRate'
+            {
+            match("blinkRate"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:34:7: ( 'clearDevice' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:34:9: 'clearDevice'
+            {
+            match("clearDevice"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:35:7: ( 'createWindow' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:35:9: 'createWindow'
+            {
+            match("createWindow"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:36:7: ( 'row' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:36:9: 'row'
+            {
+            match("row"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:37:7: ( 'column' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:37:9: 'column'
+            {
+            match("column"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:38:7: ( 'height' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:38:9: 'height'
+            {
+            match("height"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:39:7: ( 'width' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:39:9: 'width'
+            {
+            match("width"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:40:7: ( 'windowHeight' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:40:9: 'windowHeight'
+            {
+            match("windowHeight"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:41:7: ( 'windowWidth' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:41:9: 'windowWidth'
+            {
+            match("windowWidth"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:42:7: ( 'cursorType' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:42:9: 'cursorType'
+            {
+            match("cursorType"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:43:7: ( 'destroyWindow' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:43:9: 'destroyWindow'
+            {
+            match("destroyWindow"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:44:7: ( 'deviceBrightness' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:44:9: 'deviceBrightness'
+            {
+            match("deviceBrightness"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:45:7: ( 'displayBitmap' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:45:9: 'displayBitmap'
+            {
+            match("displayBitmap"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:46:7: ( 'id' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:46:9: 'id'
+            {
+            match("id"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:47:7: ( 'displayText' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:47:9: 'displayText'
+            {
+            match("displayText"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:48:7: ( 'text' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:48:9: 'text'
+            {
+            match("text"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:49:7: ( 'type' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:49:9: 'type'
+            {
+            match("type"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:50:7: ( 'displayTextAt' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:50:9: 'displayTextAt'
+            {
+            match("displayTextAt"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:51:7: ( 'interCharacterWait' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:51:9: 'interCharacterWait'
+            {
+            match("interCharacterWait"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:52:7: ( 'marqueeFormat' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:52:9: 'marqueeFormat'
+            {
+            match("marqueeFormat"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:53:7: ( 'marqueeRepeatWait' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:53:9: 'marqueeRepeatWait'
+            {
+            match("marqueeRepeatWait"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:54:7: ( 'marqueeType' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:54:9: 'marqueeType'
+            {
+            match("marqueeType"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:55:7: ( 'marqueeUnitWait' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:55:9: 'marqueeUnitWait'
+            {
+            match("marqueeUnitWait"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:56:7: ( 'scroll' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:56:9: 'scroll'
+            {
+            match("scroll"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:57:7: ( 'openDrawer' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:57:9: 'openDrawer'
+            {
+            match("openDrawer"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:58:7: ( 'printBarcode' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:58:9: 'printBarcode'
+            {
+            match("printBarcode"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:59:7: ( 'data' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:59:9: 'data'
+            {
+            match("data"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:60:7: ( 'barcodeType' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:60:9: 'barcodeType'
+            {
+            match("barcodeType"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:61:7: ( 'printBitmap' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:61:9: 'printBitmap'
+            {
+            match("printBitmap"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:62:7: ( 'printCut' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:62:9: 'printCut'
+            {
+            match("printCut"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:63:7: ( 'printNormal' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:63:9: 'printNormal'
+            {
+            match("printNormal"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:64:7: ( 'registerBitmap' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:64:9: 'registerBitmap'
+            {
+            match("registerBitmap"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:65:7: ( 'name' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:65:9: 'name'
+            {
+            match("name"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:66:7: ( 'paymentOpen' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:66:9: 'paymentOpen'
+            {
+            match("paymentOpen"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:67:7: ( 'host' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:67:9: 'host'
+            {
+            match("host"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:68:7: ( 'port' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:68:9: 'port'
+            {
+            match("port"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:69:7: ( 'paymentClose' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:69:9: 'paymentClose'
+            {
+            match("paymentClose"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:70:7: ( 'paymentAcknowledge' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:70:9: 'paymentAcknowledge'
+            {
+            match("paymentAcknowledge"); 
+
+
+            }
+
+            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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:71:7: ( 'paymentReversal' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:71:9: 'paymentReversal'
+            {
+            match("paymentReversal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__73"
+
+    // $ANTLR start "T__74"
+    public final void mT__74() throws RecognitionException {
+        try {
+            int _type = T__74;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:72:7: ( 'withPassword' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:72:9: 'withPassword'
+            {
+            match("withPassword"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__74"
+
+    // $ANTLR start "T__75"
+    public final void mT__75() throws RecognitionException {
+        try {
+            int _type = T__75;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:73:7: ( 'ofReceipt' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:73:9: 'ofReceipt'
+            {
+            match("ofReceipt"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__75"
+
+    // $ANTLR start "T__76"
+    public final void mT__76() throws RecognitionException {
+        try {
+            int _type = T__76;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:74:7: ( 'paymentRegistration' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:74:9: 'paymentRegistration'
+            {
+            match("paymentRegistration"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__76"
+
+    // $ANTLR start "T__77"
+    public final void mT__77() throws RecognitionException {
+        try {
+            int _type = T__77;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:75:7: ( 'configuration' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:75:9: 'configuration'
+            {
+            match("configuration"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__77"
+
+    // $ANTLR start "T__78"
+    public final void mT__78() throws RecognitionException {
+        try {
+            int _type = T__78;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:76:7: ( 'paymentAuthorization' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:76:9: 'paymentAuthorization'
+            {
+            match("paymentAuthorization"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__78"
+
+    // $ANTLR start "T__79"
+    public final void mT__79() throws RecognitionException {
+        try {
+            int _type = T__79;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:77:7: ( 'ofAmount' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:77:9: 'ofAmount'
+            {
+            match("ofAmount"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__79"
+
+    // $ANTLR start "T__80"
+    public final void mT__80() throws RecognitionException {
+        try {
+            int _type = T__80;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:78:7: ( 'paymentResponse' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:78:9: 'paymentResponse'
+            {
+            match("paymentResponse"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__80"
+
+    // $ANTLR start "T__81"
+    public final void mT__81() throws RecognitionException {
+        try {
+            int _type = T__81;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:79:7: ( 'from' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:79:9: 'from'
+            {
+            match("from"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__81"
+
+    // $ANTLR start "T__82"
+    public final void mT__82() throws RecognitionException {
+        try {
+            int _type = T__82;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:80:7: ( 'printReport' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:80:9: 'printReport'
+            {
+            match("printReport"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__82"
+
+    // $ANTLR start "T__83"
+    public final void mT__83() throws RecognitionException {
+        try {
+            int _type = T__83;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:81:7: ( 'operation' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:81:9: 'operation'
+            {
+            match("operation"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__83"
+
+    // $ANTLR start "T__84"
+    public final void mT__84() throws RecognitionException {
+        try {
+            int _type = T__84;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:82:7: ( '(' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:82:9: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__84"
+
+    // $ANTLR start "T__85"
+    public final void mT__85() throws RecognitionException {
+        try {
+            int _type = T__85;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:83:7: ( ')' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:83:9: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__85"
+
+    // $ANTLR start "T__86"
+    public final void mT__86() throws RecognitionException {
+        try {
+            int _type = T__86;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:84:7: ( 'guard' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:84:9: 'guard'
+            {
+            match("guard"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__86"
+
+    // $ANTLR start "T__87"
+    public final void mT__87() throws RecognitionException {
+        try {
+            int _type = T__87;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:85:7: ( 'onFail' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:85:9: 'onFail'
+            {
+            match("onFail"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__87"
+
+    // $ANTLR start "T__88"
+    public final void mT__88() throws RecognitionException {
+        try {
+            int _type = T__88;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:86:7: ( 'caption' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:86:9: 'caption'
+            {
+            match("caption"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__88"
+
+    // $ANTLR start "T__89"
+    public final void mT__89() throws RecognitionException {
+        try {
+            int _type = T__89;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:87:7: ( 'description' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:87:9: 'description'
+            {
+            match("description"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__89"
+
+    // $ANTLR start "T__90"
+    public final void mT__90() throws RecognitionException {
+        try {
+            int _type = T__90;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:88:7: ( 'function' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:88:9: 'function'
+            {
+            match("function"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__90"
+
+    // $ANTLR start "T__91"
+    public final void mT__91() throws RecognitionException {
+        try {
+            int _type = T__91;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:89:7: ( 'store' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:89:9: 'store'
+            {
+            match("store"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__91"
+
+    // $ANTLR start "T__92"
+    public final void mT__92() throws RecognitionException {
+        try {
+            int _type = T__92;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:90:7: ( 'with' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:90:9: 'with'
+            {
+            match("with"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__92"
+
+    // $ANTLR start "T__93"
+    public final void mT__93() throws RecognitionException {
+        try {
+            int _type = T__93;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:91:7: ( '.' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:91:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__93"
+
+    // $ANTLR start "T__94"
+    public final void mT__94() throws RecognitionException {
+        try {
+            int _type = T__94;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:92:7: ( 'retrieve' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:92:9: 'retrieve'
+            {
+            match("retrieve"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__94"
+
+    // $ANTLR start "T__95"
+    public final void mT__95() throws RecognitionException {
+        try {
+            int _type = T__95;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:93:7: ( 'translate' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:93:9: 'translate'
+            {
+            match("translate"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__95"
+
+    // $ANTLR start "T__96"
+    public final void mT__96() throws RecognitionException {
+        try {
+            int _type = T__96;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:94:7: ( 'dto' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:94:9: 'dto'
+            {
+            match("dto"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__96"
+
+    // $ANTLR start "T__97"
+    public final void mT__97() throws RecognitionException {
+        try {
+            int _type = T__97;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:95:7: ( '+' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:95:9: '+'
+            {
+            match('+'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__97"
+
+    // $ANTLR start "T__98"
+    public final void mT__98() throws RecognitionException {
+        try {
+            int _type = T__98;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:96:7: ( 'get' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:96:9: 'get'
+            {
+            match("get"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__98"
+
+    // $ANTLR start "T__99"
+    public final void mT__99() throws RecognitionException {
+        try {
+            int _type = T__99;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:97:7: ( ',' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:97:9: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__99"
+
+    // $ANTLR start "T__100"
+    public final void mT__100() throws RecognitionException {
+        try {
+            int _type = T__100;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:98:8: ( 'set' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:98:10: 'set'
+            {
+            match("set"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__100"
+
+    // $ANTLR start "T__101"
+    public final void mT__101() throws RecognitionException {
+        try {
+            int _type = T__101;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:99:8: ( 'clear' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:99:10: 'clear'
+            {
+            match("clear"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__101"
+
+    // $ANTLR start "T__102"
+    public final void mT__102() throws RecognitionException {
+        try {
+            int _type = T__102;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:100:8: ( 'remove' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:100:10: 'remove'
+            {
+            match("remove"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__102"
+
+    // $ANTLR start "T__103"
+    public final void mT__103() throws RecognitionException {
+        try {
+            int _type = T__103;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:101:8: ( 'visible' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:101:10: 'visible'
+            {
+            match("visible"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__103"
+
+    // $ANTLR start "T__104"
+    public final void mT__104() throws RecognitionException {
+        try {
+            int _type = T__104;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:102:8: ( 'invisible' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:102:10: 'invisible'
+            {
+            match("invisible"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__104"
+
+    // $ANTLR start "T__105"
+    public final void mT__105() throws RecognitionException {
+        try {
+            int _type = T__105;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:103:8: ( 'image' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:103:10: 'image'
+            {
+            match("image"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__105"
+
+    // $ANTLR start "T__106"
+    public final void mT__106() throws RecognitionException {
+        try {
+            int _type = T__106;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:104:8: ( 'search' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:104:10: 'search'
+            {
+            match("search"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__106"
+
+    // $ANTLR start "T__107"
+    public final void mT__107() throws RecognitionException {
+        try {
+            int _type = T__107;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:105:8: ( 'in' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:105:10: 'in'
+            {
+            match("in"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__107"
+
+    // $ANTLR start "T__108"
+    public final void mT__108() throws RecognitionException {
+        try {
+            int _type = T__108;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:106:8: ( 'schedule' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:106:10: 'schedule'
+            {
+            match("schedule"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__108"
+
+    // $ANTLR start "T__109"
+    public final void mT__109() throws RecognitionException {
+        try {
+            int _type = T__109;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:107:8: ( 'keypad' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:107:10: 'keypad'
+            {
+            match("keypad"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__109"
+
+    // $ANTLR start "T__110"
+    public final void mT__110() throws RecognitionException {
+        try {
+            int _type = T__110;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:108:8: ( 'fields' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:108:10: 'fields'
+            {
+            match("fields"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__110"
+
+    // $ANTLR start "T__111"
+    public final void mT__111() throws RecognitionException {
+        try {
+            int _type = T__111;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:109:8: ( 'dataProvider' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:109:10: 'dataProvider'
+            {
+            match("dataProvider"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__111"
+
+    // $ANTLR start "T__112"
+    public final void mT__112() throws RecognitionException {
+        try {
+            int _type = T__112;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:110:8: ( 'scheduler' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:110:10: 'scheduler'
+            {
+            match("scheduler"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__112"
+
+    // $ANTLR start "T__113"
+    public final void mT__113() throws RecognitionException {
+        try {
+            int _type = T__113;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:111:8: ( 'lineDisplay' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:111:10: 'lineDisplay'
+            {
+            match("lineDisplay"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__113"
+
+    // $ANTLR start "T__114"
+    public final void mT__114() throws RecognitionException {
+        try {
+            int _type = T__114;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:112:8: ( 'posPrinter' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:112:10: 'posPrinter'
+            {
+            match("posPrinter"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__114"
+
+    // $ANTLR start "T__115"
+    public final void mT__115() throws RecognitionException {
+        try {
+            int _type = T__115;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:113:8: ( 'cashDrawer' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:113:10: 'cashDrawer'
+            {
+            match("cashDrawer"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__115"
+
+    // $ANTLR start "T__116"
+    public final void mT__116() throws RecognitionException {
+        try {
+            int _type = T__116;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:114:8: ( 'payment' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:114:10: 'payment'
+            {
+            match("payment"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__116"
+
+    // $ANTLR start "T__117"
+    public final void mT__117() throws RecognitionException {
+        try {
+            int _type = T__117;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:115:8: ( 'peripheral' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:115:10: 'peripheral'
+            {
+            match("peripheral"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__117"
+
+    // $ANTLR start "T__118"
+    public final void mT__118() throws RecognitionException {
+        try {
+            int _type = T__118;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:116:8: ( 'button' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:116:10: 'button'
+            {
+            match("button"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__118"
+
+    // $ANTLR start "T__119"
+    public final void mT__119() throws RecognitionException {
+        try {
+            int _type = T__119;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:117:8: ( 'key' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:117:10: 'key'
+            {
+            match("key"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__119"
+
+    // $ANTLR start "T__120"
+    public final void mT__120() throws RecognitionException {
+        try {
+            int _type = T__120;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:118:8: ( 'field' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:118:10: 'field'
+            {
+            match("field"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__120"
+
+    // $ANTLR start "T__121"
+    public final void mT__121() throws RecognitionException {
+        try {
+            int _type = T__121;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:119:8: ( 'layout' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:119:10: 'layout'
+            {
+            match("layout"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__121"
+
+    // $ANTLR start "T__122"
+    public final void mT__122() throws RecognitionException {
+        try {
+            int _type = T__122;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:120:8: ( 'delay' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:120:10: 'delay'
+            {
+            match("delay"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__122"
+
+    // $ANTLR start "T__123"
+    public final void mT__123() throws RecognitionException {
+        try {
+            int _type = T__123;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:121:8: ( 'send' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:121:10: 'send'
+            {
+            match("send"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__123"
+
+    // $ANTLR start "T__124"
+    public final void mT__124() throws RecognitionException {
+        try {
+            int _type = T__124;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:122:8: ( 'import' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:122:10: 'import'
+            {
+            match("import"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__124"
+
+    // $ANTLR start "T__125"
+    public final void mT__125() throws RecognitionException {
+        try {
+            int _type = T__125;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:123:8: ( '*' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:123:10: '*'
+            {
+            match('*'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__125"
+
+    // $ANTLR start "T__126"
+    public final void mT__126() throws RecognitionException {
+        try {
+            int _type = T__126;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:124:8: ( '-' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:124:10: '-'
+            {
+            match('-'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__126"
+
+    // $ANTLR start "T__127"
+    public final void mT__127() throws RecognitionException {
+        try {
+            int _type = T__127;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:125:8: ( '=' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:125:10: '='
+            {
+            match('='); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__127"
+
+    // $ANTLR start "T__128"
+    public final void mT__128() throws RecognitionException {
+        try {
+            int _type = T__128;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:126:8: ( '#' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:126:10: '#'
+            {
+            match('#'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__128"
+
+    // $ANTLR start "T__129"
+    public final void mT__129() throws RecognitionException {
+        try {
+            int _type = T__129;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:127:8: ( '[' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:127:10: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__129"
+
+    // $ANTLR start "T__130"
+    public final void mT__130() throws RecognitionException {
+        try {
+            int _type = T__130;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:128:8: ( ']' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:128:10: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__130"
+
+    // $ANTLR start "T__131"
+    public final void mT__131() throws RecognitionException {
+        try {
+            int _type = T__131;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:129:8: ( '+=' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:129:10: '+='
+            {
+            match("+="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__131"
+
+    // $ANTLR start "T__132"
+    public final void mT__132() throws RecognitionException {
+        try {
+            int _type = T__132;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:130:8: ( '-=' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:130:10: '-='
+            {
+            match("-="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__132"
+
+    // $ANTLR start "T__133"
+    public final void mT__133() throws RecognitionException {
+        try {
+            int _type = T__133;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:131:8: ( '*=' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:131:10: '*='
+            {
+            match("*="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__133"
+
+    // $ANTLR start "T__134"
+    public final void mT__134() throws RecognitionException {
+        try {
+            int _type = T__134;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:132:8: ( '/=' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:132:10: '/='
+            {
+            match("/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__134"
+
+    // $ANTLR start "T__135"
+    public final void mT__135() throws RecognitionException {
+        try {
+            int _type = T__135;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:133:8: ( '%=' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:133:10: '%='
+            {
+            match("%="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__135"
+
+    // $ANTLR start "T__136"
+    public final void mT__136() throws RecognitionException {
+        try {
+            int _type = T__136;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:134:8: ( '<' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:134:10: '<'
+            {
+            match('<'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__136"
+
+    // $ANTLR start "T__137"
+    public final void mT__137() throws RecognitionException {
+        try {
+            int _type = T__137;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:135:8: ( '>' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:135:10: '>'
+            {
+            match('>'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__137"
+
+    // $ANTLR start "T__138"
+    public final void mT__138() throws RecognitionException {
+        try {
+            int _type = T__138;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:136:8: ( '>=' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:136:10: '>='
+            {
+            match(">="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__138"
+
+    // $ANTLR start "T__139"
+    public final void mT__139() throws RecognitionException {
+        try {
+            int _type = T__139;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:137:8: ( '||' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:137:10: '||'
+            {
+            match("||"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__139"
+
+    // $ANTLR start "T__140"
+    public final void mT__140() throws RecognitionException {
+        try {
+            int _type = T__140;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:138:8: ( '&&' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:138:10: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__140"
+
+    // $ANTLR start "T__141"
+    public final void mT__141() throws RecognitionException {
+        try {
+            int _type = T__141;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:139:8: ( '==' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:139:10: '=='
+            {
+            match("=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__141"
+
+    // $ANTLR start "T__142"
+    public final void mT__142() throws RecognitionException {
+        try {
+            int _type = T__142;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:140:8: ( '!=' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:140:10: '!='
+            {
+            match("!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__142"
+
+    // $ANTLR start "T__143"
+    public final void mT__143() throws RecognitionException {
+        try {
+            int _type = T__143;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:141:8: ( '===' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:141:10: '==='
+            {
+            match("==="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__143"
+
+    // $ANTLR start "T__144"
+    public final void mT__144() throws RecognitionException {
+        try {
+            int _type = T__144;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:142:8: ( '!==' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:142:10: '!=='
+            {
+            match("!=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__144"
+
+    // $ANTLR start "T__145"
+    public final void mT__145() throws RecognitionException {
+        try {
+            int _type = T__145;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:143:8: ( 'instanceof' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:143:10: 'instanceof'
+            {
+            match("instanceof"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__145"
+
+    // $ANTLR start "T__146"
+    public final void mT__146() throws RecognitionException {
+        try {
+            int _type = T__146;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:144:8: ( '->' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:144:10: '->'
+            {
+            match("->"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__146"
+
+    // $ANTLR start "T__147"
+    public final void mT__147() throws RecognitionException {
+        try {
+            int _type = T__147;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:145:8: ( '..<' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:145:10: '..<'
+            {
+            match("..<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__147"
+
+    // $ANTLR start "T__148"
+    public final void mT__148() throws RecognitionException {
+        try {
+            int _type = T__148;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:146:8: ( '..' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:146:10: '..'
+            {
+            match(".."); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__148"
+
+    // $ANTLR start "T__149"
+    public final void mT__149() throws RecognitionException {
+        try {
+            int _type = T__149;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:147:8: ( '=>' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:147:10: '=>'
+            {
+            match("=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__149"
+
+    // $ANTLR start "T__150"
+    public final void mT__150() throws RecognitionException {
+        try {
+            int _type = T__150;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:148:8: ( '<>' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:148:10: '<>'
+            {
+            match("<>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__150"
+
+    // $ANTLR start "T__151"
+    public final void mT__151() throws RecognitionException {
+        try {
+            int _type = T__151;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:149:8: ( '?:' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:149:10: '?:'
+            {
+            match("?:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__151"
+
+    // $ANTLR start "T__152"
+    public final void mT__152() throws RecognitionException {
+        try {
+            int _type = T__152;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:150:8: ( '**' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:150:10: '**'
+            {
+            match("**"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__152"
+
+    // $ANTLR start "T__153"
+    public final void mT__153() throws RecognitionException {
+        try {
+            int _type = T__153;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:151:8: ( '/' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:151:10: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__153"
+
+    // $ANTLR start "T__154"
+    public final void mT__154() throws RecognitionException {
+        try {
+            int _type = T__154;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:152:8: ( '%' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:152:10: '%'
+            {
+            match('%'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__154"
+
+    // $ANTLR start "T__155"
+    public final void mT__155() throws RecognitionException {
+        try {
+            int _type = T__155;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:153:8: ( '!' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:153:10: '!'
+            {
+            match('!'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__155"
+
+    // $ANTLR start "T__156"
+    public final void mT__156() throws RecognitionException {
+        try {
+            int _type = T__156;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:154:8: ( 'as' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:154:10: 'as'
+            {
+            match("as"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__156"
+
+    // $ANTLR start "T__157"
+    public final void mT__157() throws RecognitionException {
+        try {
+            int _type = T__157;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:155:8: ( '++' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:155:10: '++'
+            {
+            match("++"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__157"
+
+    // $ANTLR start "T__158"
+    public final void mT__158() throws RecognitionException {
+        try {
+            int _type = T__158;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:156:8: ( '--' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:156:10: '--'
+            {
+            match("--"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__158"
+
+    // $ANTLR start "T__159"
+    public final void mT__159() throws RecognitionException {
+        try {
+            int _type = T__159;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:157:8: ( '::' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:157:10: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__159"
+
+    // $ANTLR start "T__160"
+    public final void mT__160() throws RecognitionException {
+        try {
+            int _type = T__160;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:158:8: ( '?.' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:158:10: '?.'
+            {
+            match("?."); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__160"
+
+    // $ANTLR start "T__161"
+    public final void mT__161() throws RecognitionException {
+        try {
+            int _type = T__161;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:159:8: ( '|' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:159:10: '|'
+            {
+            match('|'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__161"
+
+    // $ANTLR start "T__162"
+    public final void mT__162() throws RecognitionException {
+        try {
+            int _type = T__162;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:160:8: ( ';' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:160:10: ';'
+            {
+            match(';'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__162"
+
+    // $ANTLR start "T__163"
+    public final void mT__163() throws RecognitionException {
+        try {
+            int _type = T__163;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:161:8: ( 'if' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:161:10: 'if'
+            {
+            match("if"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__163"
+
+    // $ANTLR start "T__164"
+    public final void mT__164() throws RecognitionException {
+        try {
+            int _type = T__164;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:162:8: ( 'else' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:162:10: 'else'
+            {
+            match("else"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__164"
+
+    // $ANTLR start "T__165"
+    public final void mT__165() throws RecognitionException {
+        try {
+            int _type = T__165;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:163:8: ( 'switch' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:163:10: 'switch'
+            {
+            match("switch"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__165"
+
+    // $ANTLR start "T__166"
+    public final void mT__166() throws RecognitionException {
+        try {
+            int _type = T__166;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:164:8: ( ':' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:164:10: ':'
+            {
+            match(':'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__166"
+
+    // $ANTLR start "T__167"
+    public final void mT__167() throws RecognitionException {
+        try {
+            int _type = T__167;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:165:8: ( 'default' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:165:10: 'default'
+            {
+            match("default"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__167"
+
+    // $ANTLR start "T__168"
+    public final void mT__168() throws RecognitionException {
+        try {
+            int _type = T__168;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:166:8: ( 'case' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:166:10: 'case'
+            {
+            match("case"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__168"
+
+    // $ANTLR start "T__169"
+    public final void mT__169() throws RecognitionException {
+        try {
+            int _type = T__169;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:167:8: ( 'for' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:167:10: 'for'
+            {
+            match("for"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__169"
+
+    // $ANTLR start "T__170"
+    public final void mT__170() throws RecognitionException {
+        try {
+            int _type = T__170;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:168:8: ( 'while' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:168:10: 'while'
+            {
+            match("while"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__170"
+
+    // $ANTLR start "T__171"
+    public final void mT__171() throws RecognitionException {
+        try {
+            int _type = T__171;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:169:8: ( 'do' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:169:10: 'do'
+            {
+            match("do"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__171"
+
+    // $ANTLR start "T__172"
+    public final void mT__172() throws RecognitionException {
+        try {
+            int _type = T__172;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:170:8: ( 'var' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:170:10: 'var'
+            {
+            match("var"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__172"
+
+    // $ANTLR start "T__173"
+    public final void mT__173() throws RecognitionException {
+        try {
+            int _type = T__173;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:171:8: ( 'val' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:171:10: 'val'
+            {
+            match("val"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__173"
+
+    // $ANTLR start "T__174"
+    public final void mT__174() throws RecognitionException {
+        try {
+            int _type = T__174;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:172:8: ( 'extends' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:172:10: 'extends'
+            {
+            match("extends"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__174"
+
+    // $ANTLR start "T__175"
+    public final void mT__175() throws RecognitionException {
+        try {
+            int _type = T__175;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:173:8: ( 'static' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:173:10: 'static'
+            {
+            match("static"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__175"
+
+    // $ANTLR start "T__176"
+    public final void mT__176() throws RecognitionException {
+        try {
+            int _type = T__176;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:174:8: ( 'extension' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:174:10: 'extension'
+            {
+            match("extension"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__176"
+
+    // $ANTLR start "T__177"
+    public final void mT__177() throws RecognitionException {
+        try {
+            int _type = T__177;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:175:8: ( 'super' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:175:10: 'super'
+            {
+            match("super"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__177"
+
+    // $ANTLR start "T__178"
+    public final void mT__178() throws RecognitionException {
+        try {
+            int _type = T__178;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:176:8: ( 'new' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:176:10: 'new'
+            {
+            match("new"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__178"
+
+    // $ANTLR start "T__179"
+    public final void mT__179() throws RecognitionException {
+        try {
+            int _type = T__179;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:177:8: ( 'false' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:177:10: 'false'
+            {
+            match("false"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__179"
+
+    // $ANTLR start "T__180"
+    public final void mT__180() throws RecognitionException {
+        try {
+            int _type = T__180;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:178:8: ( 'true' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:178:10: 'true'
+            {
+            match("true"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__180"
+
+    // $ANTLR start "T__181"
+    public final void mT__181() throws RecognitionException {
+        try {
+            int _type = T__181;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:179:8: ( 'null' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:179:10: 'null'
+            {
+            match("null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__181"
+
+    // $ANTLR start "T__182"
+    public final void mT__182() throws RecognitionException {
+        try {
+            int _type = T__182;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:180:8: ( 'typeof' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:180:10: 'typeof'
+            {
+            match("typeof"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__182"
+
+    // $ANTLR start "T__183"
+    public final void mT__183() throws RecognitionException {
+        try {
+            int _type = T__183;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:181:8: ( 'throw' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:181:10: 'throw'
+            {
+            match("throw"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__183"
+
+    // $ANTLR start "T__184"
+    public final void mT__184() throws RecognitionException {
+        try {
+            int _type = T__184;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:182:8: ( 'return' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:182:10: 'return'
+            {
+            match("return"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__184"
+
+    // $ANTLR start "T__185"
+    public final void mT__185() throws RecognitionException {
+        try {
+            int _type = T__185;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:183:8: ( 'try' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:183:10: 'try'
+            {
+            match("try"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__185"
+
+    // $ANTLR start "T__186"
+    public final void mT__186() throws RecognitionException {
+        try {
+            int _type = T__186;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:184:8: ( 'finally' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:184:10: 'finally'
+            {
+            match("finally"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__186"
+
+    // $ANTLR start "T__187"
+    public final void mT__187() throws RecognitionException {
+        try {
+            int _type = T__187;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:185:8: ( 'synchronized' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:185:10: 'synchronized'
+            {
+            match("synchronized"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__187"
+
+    // $ANTLR start "T__188"
+    public final void mT__188() throws RecognitionException {
+        try {
+            int _type = T__188;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:186:8: ( 'catch' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:186:10: 'catch'
+            {
+            match("catch"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__188"
+
+    // $ANTLR start "T__189"
+    public final void mT__189() throws RecognitionException {
+        try {
+            int _type = T__189;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:187:8: ( '?' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:187:10: '?'
+            {
+            match('?'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__189"
+
+    // $ANTLR start "T__190"
+    public final void mT__190() throws RecognitionException {
+        try {
+            int _type = T__190;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:188:8: ( '&' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:188:10: '&'
+            {
+            match('&'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__190"
+
+    // $ANTLR start "T__191"
+    public final void mT__191() throws RecognitionException {
+        try {
+            int _type = T__191;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:189:8: ( 'Boolean' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:189:10: 'Boolean'
+            {
+            match("Boolean"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__191"
+
+    // $ANTLR start "T__192"
+    public final void mT__192() throws RecognitionException {
+        try {
+            int _type = T__192;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:190:8: ( 'Integer' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:190:10: 'Integer'
+            {
+            match("Integer"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__192"
+
+    // $ANTLR start "T__193"
+    public final void mT__193() throws RecognitionException {
+        try {
+            int _type = T__193;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:191:8: ( 'Long' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:191:10: 'Long'
+            {
+            match("Long"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__193"
+
+    // $ANTLR start "T__194"
+    public final void mT__194() throws RecognitionException {
+        try {
+            int _type = T__194;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:192:8: ( 'Double' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:192:10: 'Double'
+            {
+            match("Double"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__194"
+
+    // $ANTLR start "T__195"
+    public final void mT__195() throws RecognitionException {
+        try {
+            int _type = T__195;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:193:8: ( 'String' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:193:10: 'String'
+            {
+            match("String"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__195"
+
+    // $ANTLR start "T__196"
+    public final void mT__196() throws RecognitionException {
+        try {
+            int _type = T__196;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:194:8: ( 'Date' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:194:10: 'Date'
+            {
+            match("Date"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__196"
+
+    // $ANTLR start "T__197"
+    public final void mT__197() throws RecognitionException {
+        try {
+            int _type = T__197;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:195:8: ( 'SuggestText' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:195:10: 'SuggestText'
+            {
+            match("SuggestText"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__197"
+
+    // $ANTLR start "T__198"
+    public final void mT__198() throws RecognitionException {
+        try {
+            int _type = T__198;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:196:8: ( 'keyboard' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:196:10: 'keyboard'
+            {
+            match("keyboard"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__198"
+
+    // $ANTLR start "T__199"
+    public final void mT__199() throws RecognitionException {
+        try {
+            int _type = T__199;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:197:8: ( 'getIPAddress' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:197:10: 'getIPAddress'
+            {
+            match("getIPAddress"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__199"
+
+    // $ANTLR start "T__200"
+    public final void mT__200() throws RecognitionException {
+        try {
+            int _type = T__200;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:198:8: ( 'getNow' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:198:10: 'getNow'
+            {
+            match("getNow"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__200"
+
+    // $ANTLR start "T__201"
+    public final void mT__201() throws RecognitionException {
+        try {
+            int _type = T__201;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:199:8: ( 'getUserAgentInfo' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:199:10: 'getUserAgentInfo'
+            {
+            match("getUserAgentInfo"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__201"
+
+    // $ANTLR start "T__202"
+    public final void mT__202() throws RecognitionException {
+        try {
+            int _type = T__202;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:200:8: ( 'isTouchDevice' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:200:10: 'isTouchDevice'
+            {
+            match("isTouchDevice"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__202"
+
+    // $ANTLR start "T__203"
+    public final void mT__203() throws RecognitionException {
+        try {
+            int _type = T__203;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:201:8: ( 'isHttps' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:201:10: 'isHttps'
+            {
+            match("isHttps"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__203"
+
+    // $ANTLR start "T__204"
+    public final void mT__204() throws RecognitionException {
+        try {
+            int _type = T__204;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:202:8: ( 'getBrowserLocale' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:202:10: 'getBrowserLocale'
+            {
+            match("getBrowserLocale"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__204"
+
+    // $ANTLR start "T__205"
+    public final void mT__205() throws RecognitionException {
+        try {
+            int _type = T__205;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:203:8: ( 'getUserName' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:203:10: 'getUserName'
+            {
+            match("getUserName"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__205"
+
+    // $ANTLR start "T__206"
+    public final void mT__206() throws RecognitionException {
+        try {
+            int _type = T__206;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:204:8: ( 'getUserPassword' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:204:10: 'getUserPassword'
+            {
+            match("getUserPassword"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__206"
+
+    // $ANTLR start "T__207"
+    public final void mT__207() throws RecognitionException {
+        try {
+            int _type = T__207;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:205:8: ( 'getUserEmail' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:205:10: 'getUserEmail'
+            {
+            match("getUserEmail"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__207"
+
+    // $ANTLR start "T__208"
+    public final void mT__208() throws RecognitionException {
+        try {
+            int _type = T__208;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:206:8: ( 'getUserPosition' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:206:10: 'getUserPosition'
+            {
+            match("getUserPosition"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__208"
+
+    // $ANTLR start "T__209"
+    public final void mT__209() throws RecognitionException {
+        try {
+            int _type = T__209;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:207:8: ( 'getUserPrintService' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:207:10: 'getUserPrintService'
+            {
+            match("getUserPrintService"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__209"
+
+    // $ANTLR start "T__210"
+    public final void mT__210() throws RecognitionException {
+        try {
+            int _type = T__210;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:208:8: ( 'getSceenWidth' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:208:10: 'getSceenWidth'
+            {
+            match("getSceenWidth"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__210"
+
+    // $ANTLR start "T__211"
+    public final void mT__211() throws RecognitionException {
+        try {
+            int _type = T__211;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:209:8: ( 'getScreenHeight' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:209:10: 'getScreenHeight'
+            {
+            match("getScreenHeight"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__211"
+
+    // $ANTLR start "T__212"
+    public final void mT__212() throws RecognitionException {
+        try {
+            int _type = T__212;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:210:8: ( 'getTrigger' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:210:10: 'getTrigger'
+            {
+            match("getTrigger"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__212"
+
+    // $ANTLR start "T__213"
+    public final void mT__213() throws RecognitionException {
+        try {
+            int _type = T__213;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:211:8: ( 'humanized' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:211:10: 'humanized'
+            {
+            match("humanized"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__213"
+
+    // $ANTLR start "T__214"
+    public final void mT__214() throws RecognitionException {
+        try {
+            int _type = T__214;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:212:8: ( 'warning' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:212:10: 'warning'
+            {
+            match("warning"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__214"
+
+    // $ANTLR start "T__215"
+    public final void mT__215() throws RecognitionException {
+        try {
+            int _type = T__215;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:213:8: ( 'error' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:213:10: 'error'
+            {
+            match("error"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__215"
+
+    // $ANTLR start "T__216"
+    public final void mT__216() throws RecognitionException {
+        try {
+            int _type = T__216;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:214:8: ( 'tray' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:214:10: 'tray'
+            {
+            match("tray"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__216"
+
+    // $ANTLR start "T__217"
+    public final void mT__217() throws RecognitionException {
+        try {
+            int _type = T__217;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:215:8: ( 'assistive' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:215:10: 'assistive'
+            {
+            match("assistive"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__217"
+
+    // $ANTLR start "T__218"
+    public final void mT__218() throws RecognitionException {
+        try {
+            int _type = T__218;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:216:8: ( 'none' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:216:10: 'none'
+            {
+            match("none"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__218"
+
+    // $ANTLR start "T__219"
+    public final void mT__219() throws RecognitionException {
+        try {
+            int _type = T__219;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:217:8: ( 'fixed' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:217:10: 'fixed'
+            {
+            match("fixed"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__219"
+
+    // $ANTLR start "T__220"
+    public final void mT__220() throws RecognitionException {
+        try {
+            int _type = T__220;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:218:8: ( 'block' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:218:10: 'block'
+            {
+            match("block"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__220"
+
+    // $ANTLR start "T__221"
+    public final void mT__221() throws RecognitionException {
+        try {
+            int _type = T__221;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:219:8: ( 'halfblock' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:219:10: 'halfblock'
+            {
+            match("halfblock"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__221"
+
+    // $ANTLR start "T__222"
+    public final void mT__222() throws RecognitionException {
+        try {
+            int _type = T__222;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:220:8: ( 'underline' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:220:10: 'underline'
+            {
+            match("underline"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__222"
+
+    // $ANTLR start "T__223"
+    public final void mT__223() throws RecognitionException {
+        try {
+            int _type = T__223;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:221:8: ( 'reverse' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:221:10: 'reverse'
+            {
+            match("reverse"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__223"
+
+    // $ANTLR start "T__224"
+    public final void mT__224() throws RecognitionException {
+        try {
+            int _type = T__224;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:222:8: ( 'other' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:222:10: 'other'
+            {
+            match("other"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__224"
+
+    // $ANTLR start "T__225"
+    public final void mT__225() throws RecognitionException {
+        try {
+            int _type = T__225;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:223:8: ( 'blink' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:223:10: 'blink'
+            {
+            match("blink"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__225"
+
+    // $ANTLR start "T__226"
+    public final void mT__226() throws RecognitionException {
+        try {
+            int _type = T__226;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:224:8: ( 'up' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:224:10: 'up'
+            {
+            match("up"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__226"
+
+    // $ANTLR start "T__227"
+    public final void mT__227() throws RecognitionException {
+        try {
+            int _type = T__227;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:225:8: ( 'down' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:225:10: 'down'
+            {
+            match("down"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__227"
+
+    // $ANTLR start "T__228"
+    public final void mT__228() throws RecognitionException {
+        try {
+            int _type = T__228;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:226:8: ( 'left' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:226:10: 'left'
+            {
+            match("left"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__228"
+
+    // $ANTLR start "T__229"
+    public final void mT__229() throws RecognitionException {
+        try {
+            int _type = T__229;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:227:8: ( 'right' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:227:10: 'right'
+            {
+            match("right"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__229"
+
+    // $ANTLR start "T__230"
+    public final void mT__230() throws RecognitionException {
+        try {
+            int _type = T__230;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:228:8: ( 'init' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:228:10: 'init'
+            {
+            match("init"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__230"
+
+    // $ANTLR start "T__231"
+    public final void mT__231() throws RecognitionException {
+        try {
+            int _type = T__231;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:229:8: ( 'walk' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:229:10: 'walk'
+            {
+            match("walk"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__231"
+
+    // $ANTLR start "T__232"
+    public final void mT__232() throws RecognitionException {
+        try {
+            int _type = T__232;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:230:8: ( 'place' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:230:10: 'place'
+            {
+            match("place"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__232"
+
+    // $ANTLR start "T__233"
+    public final void mT__233() throws RecognitionException {
+        try {
+            int _type = T__233;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:231:8: ( 'normal' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:231:10: 'normal'
+            {
+            match("normal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__233"
+
+    // $ANTLR start "T__234"
+    public final void mT__234() throws RecognitionException {
+        try {
+            int _type = T__234;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:232:8: ( 'blinkreverse' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:232:10: 'blinkreverse'
+            {
+            match("blinkreverse"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__234"
+
+    // $ANTLR start "T__235"
+    public final void mT__235() throws RecognitionException {
+        try {
+            int _type = T__235;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:233:8: ( 'upca' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:233:10: 'upca'
+            {
+            match("upca"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__235"
+
+    // $ANTLR start "T__236"
+    public final void mT__236() throws RecognitionException {
+        try {
+            int _type = T__236;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:234:8: ( 'upcb' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:234:10: 'upcb'
+            {
+            match("upcb"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__236"
+
+    // $ANTLR start "T__237"
+    public final void mT__237() throws RecognitionException {
+        try {
+            int _type = T__237;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:235:8: ( 'jan8' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:235:10: 'jan8'
+            {
+            match("jan8"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__237"
+
+    // $ANTLR start "T__238"
+    public final void mT__238() throws RecognitionException {
+        try {
+            int _type = T__238;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:236:8: ( 'ean8' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:236:10: 'ean8'
+            {
+            match("ean8"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__238"
+
+    // $ANTLR start "T__239"
+    public final void mT__239() throws RecognitionException {
+        try {
+            int _type = T__239;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:237:8: ( 'jan13' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:237:10: 'jan13'
+            {
+            match("jan13"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__239"
+
+    // $ANTLR start "T__240"
+    public final void mT__240() throws RecognitionException {
+        try {
+            int _type = T__240;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:238:8: ( 'ean13' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:238:10: 'ean13'
+            {
+            match("ean13"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__240"
+
+    // $ANTLR start "T__241"
+    public final void mT__241() throws RecognitionException {
+        try {
+            int _type = T__241;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:239:8: ( 'tf' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:239:10: 'tf'
+            {
+            match("tf"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__241"
+
+    // $ANTLR start "T__242"
+    public final void mT__242() throws RecognitionException {
+        try {
+            int _type = T__242;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:240:8: ( 'itf' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:240:10: 'itf'
+            {
+            match("itf"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__242"
+
+    // $ANTLR start "T__243"
+    public final void mT__243() throws RecognitionException {
+        try {
+            int _type = T__243;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:241:8: ( 'codeabar' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:241:10: 'codeabar'
+            {
+            match("codeabar"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__243"
+
+    // $ANTLR start "T__244"
+    public final void mT__244() throws RecognitionException {
+        try {
+            int _type = T__244;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:242:8: ( 'code39' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:242:10: 'code39'
+            {
+            match("code39"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__244"
+
+    // $ANTLR start "T__245"
+    public final void mT__245() throws RecognitionException {
+        try {
+            int _type = T__245;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:243:8: ( 'code93' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:243:10: 'code93'
+            {
+            match("code93"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__245"
+
+    // $ANTLR start "T__246"
+    public final void mT__246() throws RecognitionException {
+        try {
+            int _type = T__246;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:244:8: ( 'code128' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:244:10: 'code128'
+            {
+            match("code128"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__246"
+
+    // $ANTLR start "T__247"
+    public final void mT__247() throws RecognitionException {
+        try {
+            int _type = T__247;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:245:8: ( 'upca_s' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:245:10: 'upca_s'
+            {
+            match("upca_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__247"
+
+    // $ANTLR start "T__248"
+    public final void mT__248() throws RecognitionException {
+        try {
+            int _type = T__248;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:246:8: ( 'upce_s' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:246:10: 'upce_s'
+            {
+            match("upce_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__248"
+
+    // $ANTLR start "T__249"
+    public final void mT__249() throws RecognitionException {
+        try {
+            int _type = T__249;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:247:8: ( 'upcd1' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:247:10: 'upcd1'
+            {
+            match("upcd1"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__249"
+
+    // $ANTLR start "T__250"
+    public final void mT__250() throws RecognitionException {
+        try {
+            int _type = T__250;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:248:8: ( 'upcd2' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:248:10: 'upcd2'
+            {
+            match("upcd2"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__250"
+
+    // $ANTLR start "T__251"
+    public final void mT__251() throws RecognitionException {
+        try {
+            int _type = T__251;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:249:8: ( 'upcd3' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:249:10: 'upcd3'
+            {
+            match("upcd3"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__251"
+
+    // $ANTLR start "T__252"
+    public final void mT__252() throws RecognitionException {
+        try {
+            int _type = T__252;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:250:8: ( 'upcd4' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:250:10: 'upcd4'
+            {
+            match("upcd4"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__252"
+
+    // $ANTLR start "T__253"
+    public final void mT__253() throws RecognitionException {
+        try {
+            int _type = T__253;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:251:8: ( 'upcd5' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:251:10: 'upcd5'
+            {
+            match("upcd5"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__253"
+
+    // $ANTLR start "T__254"
+    public final void mT__254() throws RecognitionException {
+        try {
+            int _type = T__254;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:252:8: ( 'ean8_s' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:252:10: 'ean8_s'
+            {
+            match("ean8_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__254"
+
+    // $ANTLR start "T__255"
+    public final void mT__255() throws RecognitionException {
+        try {
+            int _type = T__255;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:253:8: ( 'ean13_s' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:253:10: 'ean13_s'
+            {
+            match("ean13_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__255"
+
+    // $ANTLR start "T__256"
+    public final void mT__256() throws RecognitionException {
+        try {
+            int _type = T__256;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:254:8: ( 'ean128' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:254:10: 'ean128'
+            {
+            match("ean128"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__256"
+
+    // $ANTLR start "T__257"
+    public final void mT__257() throws RecognitionException {
+        try {
+            int _type = T__257;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:255:8: ( 'orca' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:255:10: 'orca'
+            {
+            match("orca"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__257"
+
+    // $ANTLR start "T__258"
+    public final void mT__258() throws RecognitionException {
+        try {
+            int _type = T__258;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:256:8: ( 'ocrb' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:256:10: 'ocrb'
+            {
+            match("ocrb"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__258"
+
+    // $ANTLR start "T__259"
+    public final void mT__259() throws RecognitionException {
+        try {
+            int _type = T__259;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:257:8: ( 'code128_parsed' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:257:10: 'code128_parsed'
+            {
+            match("code128_parsed"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__259"
+
+    // $ANTLR start "T__260"
+    public final void mT__260() throws RecognitionException {
+        try {
+            int _type = T__260;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:258:8: ( 'gs1databar' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:258:10: 'gs1databar'
+            {
+            match("gs1databar"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__260"
+
+    // $ANTLR start "T__261"
+    public final void mT__261() throws RecognitionException {
+        try {
+            int _type = T__261;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:259:8: ( 'gs1databar_e' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:259:10: 'gs1databar_e'
+            {
+            match("gs1databar_e"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__261"
+
+    // $ANTLR start "T__262"
+    public final void mT__262() throws RecognitionException {
+        try {
+            int _type = T__262;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:260:8: ( 'gs1databar_s' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:260:10: 'gs1databar_s'
+            {
+            match("gs1databar_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__262"
+
+    // $ANTLR start "T__263"
+    public final void mT__263() throws RecognitionException {
+        try {
+            int _type = T__263;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:261:8: ( 'gs1databar_e_s' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:261:10: 'gs1databar_e_s'
+            {
+            match("gs1databar_e_s"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__263"
+
+    // $ANTLR start "T__264"
+    public final void mT__264() throws RecognitionException {
+        try {
+            int _type = T__264;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:262:8: ( 'pdf417' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:262:10: 'pdf417'
+            {
+            match("pdf417"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__264"
+
+    // $ANTLR start "T__265"
+    public final void mT__265() throws RecognitionException {
+        try {
+            int _type = T__265;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:263:8: ( 'maxicode' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:263:10: 'maxicode'
+            {
+            match("maxicode"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__265"
+
+    // $ANTLR start "T__266"
+    public final void mT__266() throws RecognitionException {
+        try {
+            int _type = T__266;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:264:8: ( 'datamatrix' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:264:10: 'datamatrix'
+            {
+            match("datamatrix"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__266"
+
+    // $ANTLR start "T__267"
+    public final void mT__267() throws RecognitionException {
+        try {
+            int _type = T__267;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:265:8: ( 'qrcode' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:265:10: 'qrcode'
+            {
+            match("qrcode"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__267"
+
+    // $ANTLR start "T__268"
+    public final void mT__268() throws RecognitionException {
+        try {
+            int _type = T__268;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:266:8: ( 'uqrcode' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:266:10: 'uqrcode'
+            {
+            match("uqrcode"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__268"
+
+    // $ANTLR start "T__269"
+    public final void mT__269() throws RecognitionException {
+        try {
+            int _type = T__269;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:267:8: ( 'aztec' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:267:10: 'aztec'
+            {
+            match("aztec"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__269"
+
+    // $ANTLR start "T__270"
+    public final void mT__270() throws RecognitionException {
+        try {
+            int _type = T__270;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:268:8: ( 'updf417' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:268:10: 'updf417'
+            {
+            match("updf417"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__270"
+
+    // $ANTLR start "RULE_HEX"
+    public final void mRULE_HEX() throws RecognitionException {
+        try {
+            int _type = RULE_HEX;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:12: ( '0x' | '0X' )
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0=='0') ) {
+                int LA1_1 = input.LA(2);
+
+                if ( (LA1_1=='x') ) {
+                    alt1=1;
+                }
+                else if ( (LA1_1=='X') ) {
+                    alt1=2;
+                }
+                else {
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 1, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 1, 0, input);
+
+                throw nvae;
+            }
+            switch (alt1) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:13: '0x'
+                    {
+                    match("0x"); 
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:18: '0X'
+                    {
+                    match("0X"); 
+
+
+                    }
+                    break;
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            int cnt2=0;
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( ((LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='F')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='f')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='f') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt2 >= 1 ) break loop2;
+                        EarlyExitException eee =
+                            new EarlyExitException(2, input);
+                        throw eee;
+                }
+                cnt2++;
+            } while (true);
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0=='#') ) {
+                alt4=1;
+            }
+            switch (alt4) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    {
+                    match('#'); 
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    int alt3=2;
+                    int LA3_0 = input.LA(1);
+
+                    if ( (LA3_0=='B'||LA3_0=='b') ) {
+                        alt3=1;
+                    }
+                    else if ( (LA3_0=='L'||LA3_0=='l') ) {
+                        alt3=2;
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 3, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt3) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            {
+                            if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+                            if ( input.LA(1)=='I'||input.LA(1)=='i' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+                        case 2 :
+                            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13889:84: ( 'l' | 'L' )
+                            {
+                            if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_HEX"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13891:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13891:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            {
+            matchRange('0','9'); 
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13891:21: ( '0' .. '9' | '_' )*
+            loop5:
+            do {
+                int alt5=2;
+                int LA5_0 = input.LA(1);
+
+                if ( ((LA5_0>='0' && LA5_0<='9')||LA5_0=='_') ) {
+                    alt5=1;
+                }
+
+
+                switch (alt5) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)=='_' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop5;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_DECIMAL"
+    public final void mRULE_DECIMAL() throws RecognitionException {
+        try {
+            int _type = RULE_DECIMAL;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13893:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13893:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            {
+            mRULE_INT(); 
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13893:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0=='E'||LA7_0=='e') ) {
+                alt7=1;
+            }
+            switch (alt7) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13893:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    {
+                    if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13893:36: ( '+' | '-' )?
+                    int alt6=2;
+                    int LA6_0 = input.LA(1);
+
+                    if ( (LA6_0=='+'||LA6_0=='-') ) {
+                        alt6=1;
+                    }
+                    switch (alt6) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:
+                            {
+                            if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+
+                    }
+
+                    mRULE_INT(); 
+
+                    }
+                    break;
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13893:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            int alt8=3;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0=='B'||LA8_0=='b') ) {
+                alt8=1;
+            }
+            else if ( (LA8_0=='D'||LA8_0=='F'||LA8_0=='L'||LA8_0=='d'||LA8_0=='f'||LA8_0=='l') ) {
+                alt8=2;
+            }
+            switch (alt8) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13893:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    {
+                    if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+                    if ( input.LA(1)=='D'||input.LA(1)=='I'||input.LA(1)=='d'||input.LA(1)=='i' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13893:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    {
+                    if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_DECIMAL"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13895:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13895:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13895:11: ( '^' )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0=='^') ) {
+                alt9=1;
+            }
+            switch (alt9) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13895: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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13895:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            loop10:
+            do {
+                int alt10=2;
+                int LA10_0 = input.LA(1);
+
+                if ( (LA10_0=='$'||(LA10_0>='0' && LA10_0<='9')||(LA10_0>='A' && LA10_0<='Z')||LA10_0=='_'||(LA10_0>='a' && LA10_0<='z')) ) {
+                    alt10=1;
+                }
+
+
+                switch (alt10) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:
+            	    {
+            	    if ( input.LA(1)=='$'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop10;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0=='\"') ) {
+                alt15=1;
+            }
+            else if ( (LA15_0=='\'') ) {
+                alt15=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 15, 0, input);
+
+                throw nvae;
+            }
+            switch (alt15) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    {
+                    match('\"'); 
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop11:
+                    do {
+                        int alt11=3;
+                        int LA11_0 = input.LA(1);
+
+                        if ( (LA11_0=='\\') ) {
+                            alt11=1;
+                        }
+                        else if ( ((LA11_0>='\u0000' && LA11_0<='!')||(LA11_0>='#' && LA11_0<='[')||(LA11_0>=']' && LA11_0<='\uFFFF')) ) {
+                            alt11=2;
+                        }
+
+
+                        switch (alt11) {
+                    	case 1 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop11;
+                        }
+                    } while (true);
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:44: ( '\"' )?
+                    int alt12=2;
+                    int LA12_0 = input.LA(1);
+
+                    if ( (LA12_0=='\"') ) {
+                        alt12=1;
+                    }
+                    switch (alt12) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:44: '\"'
+                            {
+                            match('\"'); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    {
+                    match('\''); 
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop13:
+                    do {
+                        int alt13=3;
+                        int LA13_0 = input.LA(1);
+
+                        if ( (LA13_0=='\\') ) {
+                            alt13=1;
+                        }
+                        else if ( ((LA13_0>='\u0000' && LA13_0<='&')||(LA13_0>='(' && LA13_0<='[')||(LA13_0>=']' && LA13_0<='\uFFFF')) ) {
+                            alt13=2;
+                        }
+
+
+                        switch (alt13) {
+                    	case 1 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:55: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop13;
+                        }
+                    } while (true);
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897:79: ( '\\'' )?
+                    int alt14=2;
+                    int LA14_0 = input.LA(1);
+
+                    if ( (LA14_0=='\'') ) {
+                        alt14=1;
+                    }
+                    switch (alt14) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13897: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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13899:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13899:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13899:24: ( options {greedy=false; } : . )*
+            loop16:
+            do {
+                int alt16=2;
+                int LA16_0 = input.LA(1);
+
+                if ( (LA16_0=='*') ) {
+                    int LA16_1 = input.LA(2);
+
+                    if ( (LA16_1=='/') ) {
+                        alt16=2;
+                    }
+                    else if ( ((LA16_1>='\u0000' && LA16_1<='.')||(LA16_1>='0' && LA16_1<='\uFFFF')) ) {
+                        alt16=1;
+                    }
+
+
+                }
+                else if ( ((LA16_0>='\u0000' && LA16_0<=')')||(LA16_0>='+' && LA16_0<='\uFFFF')) ) {
+                    alt16=1;
+                }
+
+
+                switch (alt16) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13899:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop16;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13901:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13901:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13901:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop17:
+            do {
+                int alt17=2;
+                int LA17_0 = input.LA(1);
+
+                if ( ((LA17_0>='\u0000' && LA17_0<='\t')||(LA17_0>='\u000B' && LA17_0<='\f')||(LA17_0>='\u000E' && LA17_0<='\uFFFF')) ) {
+                    alt17=1;
+                }
+
+
+                switch (alt17) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13901:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop17;
+                }
+            } while (true);
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13901:40: ( ( '\\r' )? '\\n' )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0=='\n'||LA19_0=='\r') ) {
+                alt19=1;
+            }
+            switch (alt19) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13901:41: ( '\\r' )? '\\n'
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13901:41: ( '\\r' )?
+                    int alt18=2;
+                    int LA18_0 = input.LA(1);
+
+                    if ( (LA18_0=='\r') ) {
+                        alt18=1;
+                    }
+                    switch (alt18) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13901: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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13903:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13903:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13903:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt20=0;
+            loop20:
+            do {
+                int alt20=2;
+                int LA20_0 = input.LA(1);
+
+                if ( ((LA20_0>='\t' && LA20_0<='\n')||LA20_0=='\r'||LA20_0==' ') ) {
+                    alt20=1;
+                }
+
+
+                switch (alt20) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt20 >= 1 ) break loop20;
+                        EarlyExitException eee =
+                            new EarlyExitException(20, input);
+                        throw eee;
+                }
+                cnt20++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13905:16: ( . )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:13905:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | T__237 | T__238 | T__239 | T__240 | T__241 | T__242 | T__243 | T__244 | T__245 | T__246 | T__247 | T__248 | T__249 | T__250 | T__251 | T__252 | T__253 | T__254 | T__255 | T__256 | T__257 | T__258 | T__259 | T__260 | T__261 | T__262 | T__263 | T__264 | T__265 | T__266 | T__267 | T__268 | T__269 | T__270 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt21=267;
+        alt21 = dfa21.predict(input);
+        switch (alt21) {
+            case 1 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:10: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 2 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:16: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 3 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:22: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 4 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:28: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 5 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:34: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 6 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:40: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 7 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:46: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 8 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:52: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 9 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:58: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 10 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:64: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 11 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:70: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 12 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:76: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 13 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:82: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 14 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:88: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 15 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:94: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 16 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:100: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 17 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:106: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 18 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:112: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 19 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:118: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 20 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:124: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 21 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:130: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 22 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:136: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 23 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:142: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 24 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:148: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 25 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:154: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 26 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:160: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 27 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:166: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 28 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:172: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 29 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:178: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 30 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:184: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 31 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:190: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 32 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:196: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 33 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:202: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 34 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:208: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 35 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:214: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 36 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:220: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 37 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:226: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 38 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:232: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 39 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:238: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 40 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:244: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 41 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:250: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 42 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:256: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 43 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:262: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 44 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:268: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 45 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:274: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 46 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:280: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 47 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:286: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 48 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:292: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 49 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:298: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 50 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:304: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 51 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:310: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 52 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:316: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 53 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:322: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 54 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:328: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 55 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:334: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 56 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:340: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 57 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:346: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 58 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:352: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 59 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:358: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 60 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:364: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 61 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:370: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 62 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:376: T__74
+                {
+                mT__74(); 
+
+                }
+                break;
+            case 63 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:382: T__75
+                {
+                mT__75(); 
+
+                }
+                break;
+            case 64 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:388: T__76
+                {
+                mT__76(); 
+
+                }
+                break;
+            case 65 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:394: T__77
+                {
+                mT__77(); 
+
+                }
+                break;
+            case 66 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:400: T__78
+                {
+                mT__78(); 
+
+                }
+                break;
+            case 67 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:406: T__79
+                {
+                mT__79(); 
+
+                }
+                break;
+            case 68 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:412: T__80
+                {
+                mT__80(); 
+
+                }
+                break;
+            case 69 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:418: T__81
+                {
+                mT__81(); 
+
+                }
+                break;
+            case 70 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:424: T__82
+                {
+                mT__82(); 
+
+                }
+                break;
+            case 71 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:430: T__83
+                {
+                mT__83(); 
+
+                }
+                break;
+            case 72 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:436: T__84
+                {
+                mT__84(); 
+
+                }
+                break;
+            case 73 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:442: T__85
+                {
+                mT__85(); 
+
+                }
+                break;
+            case 74 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:448: T__86
+                {
+                mT__86(); 
+
+                }
+                break;
+            case 75 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:454: T__87
+                {
+                mT__87(); 
+
+                }
+                break;
+            case 76 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:460: T__88
+                {
+                mT__88(); 
+
+                }
+                break;
+            case 77 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:466: T__89
+                {
+                mT__89(); 
+
+                }
+                break;
+            case 78 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:472: T__90
+                {
+                mT__90(); 
+
+                }
+                break;
+            case 79 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:478: T__91
+                {
+                mT__91(); 
+
+                }
+                break;
+            case 80 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:484: T__92
+                {
+                mT__92(); 
+
+                }
+                break;
+            case 81 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:490: T__93
+                {
+                mT__93(); 
+
+                }
+                break;
+            case 82 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:496: T__94
+                {
+                mT__94(); 
+
+                }
+                break;
+            case 83 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:502: T__95
+                {
+                mT__95(); 
+
+                }
+                break;
+            case 84 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:508: T__96
+                {
+                mT__96(); 
+
+                }
+                break;
+            case 85 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:514: T__97
+                {
+                mT__97(); 
+
+                }
+                break;
+            case 86 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:520: T__98
+                {
+                mT__98(); 
+
+                }
+                break;
+            case 87 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:526: T__99
+                {
+                mT__99(); 
+
+                }
+                break;
+            case 88 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:532: T__100
+                {
+                mT__100(); 
+
+                }
+                break;
+            case 89 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:539: T__101
+                {
+                mT__101(); 
+
+                }
+                break;
+            case 90 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:546: T__102
+                {
+                mT__102(); 
+
+                }
+                break;
+            case 91 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:553: T__103
+                {
+                mT__103(); 
+
+                }
+                break;
+            case 92 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:560: T__104
+                {
+                mT__104(); 
+
+                }
+                break;
+            case 93 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:567: T__105
+                {
+                mT__105(); 
+
+                }
+                break;
+            case 94 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:574: T__106
+                {
+                mT__106(); 
+
+                }
+                break;
+            case 95 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:581: T__107
+                {
+                mT__107(); 
+
+                }
+                break;
+            case 96 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:588: T__108
+                {
+                mT__108(); 
+
+                }
+                break;
+            case 97 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:595: T__109
+                {
+                mT__109(); 
+
+                }
+                break;
+            case 98 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:602: T__110
+                {
+                mT__110(); 
+
+                }
+                break;
+            case 99 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:609: T__111
+                {
+                mT__111(); 
+
+                }
+                break;
+            case 100 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:616: T__112
+                {
+                mT__112(); 
+
+                }
+                break;
+            case 101 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:623: T__113
+                {
+                mT__113(); 
+
+                }
+                break;
+            case 102 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:630: T__114
+                {
+                mT__114(); 
+
+                }
+                break;
+            case 103 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:637: T__115
+                {
+                mT__115(); 
+
+                }
+                break;
+            case 104 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:644: T__116
+                {
+                mT__116(); 
+
+                }
+                break;
+            case 105 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:651: T__117
+                {
+                mT__117(); 
+
+                }
+                break;
+            case 106 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:658: T__118
+                {
+                mT__118(); 
+
+                }
+                break;
+            case 107 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:665: T__119
+                {
+                mT__119(); 
+
+                }
+                break;
+            case 108 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:672: T__120
+                {
+                mT__120(); 
+
+                }
+                break;
+            case 109 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:679: T__121
+                {
+                mT__121(); 
+
+                }
+                break;
+            case 110 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:686: T__122
+                {
+                mT__122(); 
+
+                }
+                break;
+            case 111 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:693: T__123
+                {
+                mT__123(); 
+
+                }
+                break;
+            case 112 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:700: T__124
+                {
+                mT__124(); 
+
+                }
+                break;
+            case 113 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:707: T__125
+                {
+                mT__125(); 
+
+                }
+                break;
+            case 114 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:714: T__126
+                {
+                mT__126(); 
+
+                }
+                break;
+            case 115 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:721: T__127
+                {
+                mT__127(); 
+
+                }
+                break;
+            case 116 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:728: T__128
+                {
+                mT__128(); 
+
+                }
+                break;
+            case 117 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:735: T__129
+                {
+                mT__129(); 
+
+                }
+                break;
+            case 118 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:742: T__130
+                {
+                mT__130(); 
+
+                }
+                break;
+            case 119 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:749: T__131
+                {
+                mT__131(); 
+
+                }
+                break;
+            case 120 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:756: T__132
+                {
+                mT__132(); 
+
+                }
+                break;
+            case 121 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:763: T__133
+                {
+                mT__133(); 
+
+                }
+                break;
+            case 122 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:770: T__134
+                {
+                mT__134(); 
+
+                }
+                break;
+            case 123 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:777: T__135
+                {
+                mT__135(); 
+
+                }
+                break;
+            case 124 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:784: T__136
+                {
+                mT__136(); 
+
+                }
+                break;
+            case 125 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:791: T__137
+                {
+                mT__137(); 
+
+                }
+                break;
+            case 126 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:798: T__138
+                {
+                mT__138(); 
+
+                }
+                break;
+            case 127 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:805: T__139
+                {
+                mT__139(); 
+
+                }
+                break;
+            case 128 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:812: T__140
+                {
+                mT__140(); 
+
+                }
+                break;
+            case 129 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:819: T__141
+                {
+                mT__141(); 
+
+                }
+                break;
+            case 130 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:826: T__142
+                {
+                mT__142(); 
+
+                }
+                break;
+            case 131 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:833: T__143
+                {
+                mT__143(); 
+
+                }
+                break;
+            case 132 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:840: T__144
+                {
+                mT__144(); 
+
+                }
+                break;
+            case 133 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:847: T__145
+                {
+                mT__145(); 
+
+                }
+                break;
+            case 134 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:854: T__146
+                {
+                mT__146(); 
+
+                }
+                break;
+            case 135 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:861: T__147
+                {
+                mT__147(); 
+
+                }
+                break;
+            case 136 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:868: T__148
+                {
+                mT__148(); 
+
+                }
+                break;
+            case 137 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:875: T__149
+                {
+                mT__149(); 
+
+                }
+                break;
+            case 138 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:882: T__150
+                {
+                mT__150(); 
+
+                }
+                break;
+            case 139 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:889: T__151
+                {
+                mT__151(); 
+
+                }
+                break;
+            case 140 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:896: T__152
+                {
+                mT__152(); 
+
+                }
+                break;
+            case 141 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:903: T__153
+                {
+                mT__153(); 
+
+                }
+                break;
+            case 142 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:910: T__154
+                {
+                mT__154(); 
+
+                }
+                break;
+            case 143 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:917: T__155
+                {
+                mT__155(); 
+
+                }
+                break;
+            case 144 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:924: T__156
+                {
+                mT__156(); 
+
+                }
+                break;
+            case 145 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:931: T__157
+                {
+                mT__157(); 
+
+                }
+                break;
+            case 146 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:938: T__158
+                {
+                mT__158(); 
+
+                }
+                break;
+            case 147 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:945: T__159
+                {
+                mT__159(); 
+
+                }
+                break;
+            case 148 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:952: T__160
+                {
+                mT__160(); 
+
+                }
+                break;
+            case 149 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:959: T__161
+                {
+                mT__161(); 
+
+                }
+                break;
+            case 150 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:966: T__162
+                {
+                mT__162(); 
+
+                }
+                break;
+            case 151 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:973: T__163
+                {
+                mT__163(); 
+
+                }
+                break;
+            case 152 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:980: T__164
+                {
+                mT__164(); 
+
+                }
+                break;
+            case 153 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:987: T__165
+                {
+                mT__165(); 
+
+                }
+                break;
+            case 154 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:994: T__166
+                {
+                mT__166(); 
+
+                }
+                break;
+            case 155 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1001: T__167
+                {
+                mT__167(); 
+
+                }
+                break;
+            case 156 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1008: T__168
+                {
+                mT__168(); 
+
+                }
+                break;
+            case 157 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1015: T__169
+                {
+                mT__169(); 
+
+                }
+                break;
+            case 158 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1022: T__170
+                {
+                mT__170(); 
+
+                }
+                break;
+            case 159 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1029: T__171
+                {
+                mT__171(); 
+
+                }
+                break;
+            case 160 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1036: T__172
+                {
+                mT__172(); 
+
+                }
+                break;
+            case 161 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1043: T__173
+                {
+                mT__173(); 
+
+                }
+                break;
+            case 162 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1050: T__174
+                {
+                mT__174(); 
+
+                }
+                break;
+            case 163 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1057: T__175
+                {
+                mT__175(); 
+
+                }
+                break;
+            case 164 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1064: T__176
+                {
+                mT__176(); 
+
+                }
+                break;
+            case 165 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1071: T__177
+                {
+                mT__177(); 
+
+                }
+                break;
+            case 166 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1078: T__178
+                {
+                mT__178(); 
+
+                }
+                break;
+            case 167 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1085: T__179
+                {
+                mT__179(); 
+
+                }
+                break;
+            case 168 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1092: T__180
+                {
+                mT__180(); 
+
+                }
+                break;
+            case 169 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1099: T__181
+                {
+                mT__181(); 
+
+                }
+                break;
+            case 170 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1106: T__182
+                {
+                mT__182(); 
+
+                }
+                break;
+            case 171 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1113: T__183
+                {
+                mT__183(); 
+
+                }
+                break;
+            case 172 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1120: T__184
+                {
+                mT__184(); 
+
+                }
+                break;
+            case 173 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1127: T__185
+                {
+                mT__185(); 
+
+                }
+                break;
+            case 174 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1134: T__186
+                {
+                mT__186(); 
+
+                }
+                break;
+            case 175 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1141: T__187
+                {
+                mT__187(); 
+
+                }
+                break;
+            case 176 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1148: T__188
+                {
+                mT__188(); 
+
+                }
+                break;
+            case 177 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1155: T__189
+                {
+                mT__189(); 
+
+                }
+                break;
+            case 178 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1162: T__190
+                {
+                mT__190(); 
+
+                }
+                break;
+            case 179 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1169: T__191
+                {
+                mT__191(); 
+
+                }
+                break;
+            case 180 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1176: T__192
+                {
+                mT__192(); 
+
+                }
+                break;
+            case 181 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1183: T__193
+                {
+                mT__193(); 
+
+                }
+                break;
+            case 182 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1190: T__194
+                {
+                mT__194(); 
+
+                }
+                break;
+            case 183 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1197: T__195
+                {
+                mT__195(); 
+
+                }
+                break;
+            case 184 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1204: T__196
+                {
+                mT__196(); 
+
+                }
+                break;
+            case 185 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1211: T__197
+                {
+                mT__197(); 
+
+                }
+                break;
+            case 186 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1218: T__198
+                {
+                mT__198(); 
+
+                }
+                break;
+            case 187 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1225: T__199
+                {
+                mT__199(); 
+
+                }
+                break;
+            case 188 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1232: T__200
+                {
+                mT__200(); 
+
+                }
+                break;
+            case 189 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1239: T__201
+                {
+                mT__201(); 
+
+                }
+                break;
+            case 190 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1246: T__202
+                {
+                mT__202(); 
+
+                }
+                break;
+            case 191 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1253: T__203
+                {
+                mT__203(); 
+
+                }
+                break;
+            case 192 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1260: T__204
+                {
+                mT__204(); 
+
+                }
+                break;
+            case 193 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1267: T__205
+                {
+                mT__205(); 
+
+                }
+                break;
+            case 194 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1274: T__206
+                {
+                mT__206(); 
+
+                }
+                break;
+            case 195 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1281: T__207
+                {
+                mT__207(); 
+
+                }
+                break;
+            case 196 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1288: T__208
+                {
+                mT__208(); 
+
+                }
+                break;
+            case 197 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1295: T__209
+                {
+                mT__209(); 
+
+                }
+                break;
+            case 198 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1302: T__210
+                {
+                mT__210(); 
+
+                }
+                break;
+            case 199 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1309: T__211
+                {
+                mT__211(); 
+
+                }
+                break;
+            case 200 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1316: T__212
+                {
+                mT__212(); 
+
+                }
+                break;
+            case 201 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1323: T__213
+                {
+                mT__213(); 
+
+                }
+                break;
+            case 202 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1330: T__214
+                {
+                mT__214(); 
+
+                }
+                break;
+            case 203 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1337: T__215
+                {
+                mT__215(); 
+
+                }
+                break;
+            case 204 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1344: T__216
+                {
+                mT__216(); 
+
+                }
+                break;
+            case 205 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1351: T__217
+                {
+                mT__217(); 
+
+                }
+                break;
+            case 206 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1358: T__218
+                {
+                mT__218(); 
+
+                }
+                break;
+            case 207 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1365: T__219
+                {
+                mT__219(); 
+
+                }
+                break;
+            case 208 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1372: T__220
+                {
+                mT__220(); 
+
+                }
+                break;
+            case 209 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1379: T__221
+                {
+                mT__221(); 
+
+                }
+                break;
+            case 210 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1386: T__222
+                {
+                mT__222(); 
+
+                }
+                break;
+            case 211 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1393: T__223
+                {
+                mT__223(); 
+
+                }
+                break;
+            case 212 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1400: T__224
+                {
+                mT__224(); 
+
+                }
+                break;
+            case 213 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1407: T__225
+                {
+                mT__225(); 
+
+                }
+                break;
+            case 214 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1414: T__226
+                {
+                mT__226(); 
+
+                }
+                break;
+            case 215 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1421: T__227
+                {
+                mT__227(); 
+
+                }
+                break;
+            case 216 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1428: T__228
+                {
+                mT__228(); 
+
+                }
+                break;
+            case 217 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1435: T__229
+                {
+                mT__229(); 
+
+                }
+                break;
+            case 218 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1442: T__230
+                {
+                mT__230(); 
+
+                }
+                break;
+            case 219 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1449: T__231
+                {
+                mT__231(); 
+
+                }
+                break;
+            case 220 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1456: T__232
+                {
+                mT__232(); 
+
+                }
+                break;
+            case 221 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1463: T__233
+                {
+                mT__233(); 
+
+                }
+                break;
+            case 222 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1470: T__234
+                {
+                mT__234(); 
+
+                }
+                break;
+            case 223 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1477: T__235
+                {
+                mT__235(); 
+
+                }
+                break;
+            case 224 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1484: T__236
+                {
+                mT__236(); 
+
+                }
+                break;
+            case 225 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1491: T__237
+                {
+                mT__237(); 
+
+                }
+                break;
+            case 226 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1498: T__238
+                {
+                mT__238(); 
+
+                }
+                break;
+            case 227 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1505: T__239
+                {
+                mT__239(); 
+
+                }
+                break;
+            case 228 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1512: T__240
+                {
+                mT__240(); 
+
+                }
+                break;
+            case 229 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1519: T__241
+                {
+                mT__241(); 
+
+                }
+                break;
+            case 230 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1526: T__242
+                {
+                mT__242(); 
+
+                }
+                break;
+            case 231 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1533: T__243
+                {
+                mT__243(); 
+
+                }
+                break;
+            case 232 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1540: T__244
+                {
+                mT__244(); 
+
+                }
+                break;
+            case 233 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1547: T__245
+                {
+                mT__245(); 
+
+                }
+                break;
+            case 234 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1554: T__246
+                {
+                mT__246(); 
+
+                }
+                break;
+            case 235 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1561: T__247
+                {
+                mT__247(); 
+
+                }
+                break;
+            case 236 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1568: T__248
+                {
+                mT__248(); 
+
+                }
+                break;
+            case 237 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1575: T__249
+                {
+                mT__249(); 
+
+                }
+                break;
+            case 238 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1582: T__250
+                {
+                mT__250(); 
+
+                }
+                break;
+            case 239 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1589: T__251
+                {
+                mT__251(); 
+
+                }
+                break;
+            case 240 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1596: T__252
+                {
+                mT__252(); 
+
+                }
+                break;
+            case 241 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1603: T__253
+                {
+                mT__253(); 
+
+                }
+                break;
+            case 242 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1610: T__254
+                {
+                mT__254(); 
+
+                }
+                break;
+            case 243 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1617: T__255
+                {
+                mT__255(); 
+
+                }
+                break;
+            case 244 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1624: T__256
+                {
+                mT__256(); 
+
+                }
+                break;
+            case 245 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1631: T__257
+                {
+                mT__257(); 
+
+                }
+                break;
+            case 246 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1638: T__258
+                {
+                mT__258(); 
+
+                }
+                break;
+            case 247 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1645: T__259
+                {
+                mT__259(); 
+
+                }
+                break;
+            case 248 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1652: T__260
+                {
+                mT__260(); 
+
+                }
+                break;
+            case 249 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1659: T__261
+                {
+                mT__261(); 
+
+                }
+                break;
+            case 250 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1666: T__262
+                {
+                mT__262(); 
+
+                }
+                break;
+            case 251 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1673: T__263
+                {
+                mT__263(); 
+
+                }
+                break;
+            case 252 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1680: T__264
+                {
+                mT__264(); 
+
+                }
+                break;
+            case 253 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1687: T__265
+                {
+                mT__265(); 
+
+                }
+                break;
+            case 254 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1694: T__266
+                {
+                mT__266(); 
+
+                }
+                break;
+            case 255 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1701: T__267
+                {
+                mT__267(); 
+
+                }
+                break;
+            case 256 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1708: T__268
+                {
+                mT__268(); 
+
+                }
+                break;
+            case 257 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1715: T__269
+                {
+                mT__269(); 
+
+                }
+                break;
+            case 258 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1722: T__270
+                {
+                mT__270(); 
+
+                }
+                break;
+            case 259 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1729: RULE_HEX
+                {
+                mRULE_HEX(); 
+
+                }
+                break;
+            case 260 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1738: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 261 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1747: RULE_DECIMAL
+                {
+                mRULE_DECIMAL(); 
+
+                }
+                break;
+            case 262 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1760: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 263 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1768: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 264 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1780: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 265 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1796: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 266 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1812: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 267 :
+                // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1:1820: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA21 dfa21 = new DFA21(this);
+    static final String DFA21_eotS =
+        "\1\uffff\1\103\2\uffff\10\103\1\uffff\11\103\2\uffff\1\u008f\1"+
+        "\u0092\1\uffff\2\103\1\u009b\1\u009f\1\u00a2\3\uffff\1\u00a9\1\u00ab"+
+        "\1\u00ad\1\u00af\1\u00b1\1\u00b3\1\u00b5\1\u00b8\1\u00ba\1\uffff"+
+        "\10\103\2\u00ca\1\74\5\uffff\6\103\3\uffff\12\103\1\u00e8\5\103"+
+        "\1\u00f4\1\u00f6\1\103\1\u00f9\20\103\1\u0112\1\103\1\uffff\2\103"+
+        "\1\u0117\34\103\2\uffff\1\u013f\5\uffff\5\103\7\uffff\1\u0147\23"+
+        "\uffff\1\u0149\7\uffff\10\103\1\u0154\3\103\1\uffff\1\u00ca\4\uffff"+
+        "\14\103\1\u0164\13\103\1\u0171\1\103\1\uffff\5\103\1\u0178\5\103"+
+        "\1\uffff\1\103\1\uffff\2\103\1\uffff\2\103\1\u0183\21\103\1\u0199"+
+        "\3\103\1\uffff\1\u01a0\1\u01a1\2\103\1\uffff\2\103\1\u01ac\5\103"+
+        "\1\u01b2\31\103\1\u01ce\3\103\2\uffff\1\103\1\u01d3\1\u01d4\3\103"+
+        "\4\uffff\12\103\1\uffff\6\103\1\u01ec\10\103\1\uffff\1\103\1\u01f7"+
+        "\11\103\1\u0203\1\uffff\1\u0204\1\103\1\u0206\3\103\1\uffff\1\103"+
+        "\1\u020c\10\103\1\uffff\1\103\1\u0216\2\103\1\u021a\12\103\1\u0229"+
+        "\3\103\1\u022d\1\u022e\1\uffff\1\u022f\1\u0231\4\103\2\uffff\12"+
+        "\103\1\uffff\5\103\1\uffff\7\103\1\u024c\4\103\1\u0252\2\103\1\u0255"+
+        "\10\103\1\u025e\1\u025f\1\u0260\1\uffff\1\u0261\1\u0262\2\103\2"+
+        "\uffff\2\103\1\u0267\2\103\1\u026a\1\103\1\u026c\3\103\1\u0271\1"+
+        "\u0272\4\103\1\u027b\5\103\1\uffff\2\103\1\u0286\1\103\1\u028a\1"+
+        "\103\1\u028c\3\103\1\uffff\1\103\1\u0291\4\103\1\u0296\4\103\2\uffff"+
+        "\1\103\1\uffff\1\u029d\1\103\1\u029f\1\u02a0\1\103\1\uffff\4\103"+
+        "\1\u02a6\3\103\1\u02ab\1\uffff\1\103\1\u02ae\1\103\1\uffff\1\u02b1"+
+        "\10\103\1\u02bb\4\103\1\uffff\1\u02c0\2\103\3\uffff\1\103\1\uffff"+
+        "\1\u02c5\5\103\1\u02cb\1\u02cd\7\103\1\u02d8\1\u02d9\7\103\1\u02e1"+
+        "\1\103\1\uffff\2\103\1\u02e5\2\103\1\uffff\1\u02e8\1\103\1\uffff"+
+        "\7\103\1\u02f1\5\uffff\4\103\1\uffff\2\103\1\uffff\1\103\1\uffff"+
+        "\4\103\2\uffff\1\103\1\u02fe\1\u02ff\1\u0300\1\u0301\1\u0302\2\103"+
+        "\1\uffff\1\u0305\11\103\1\uffff\1\u0310\1\103\1\u0312\1\uffff\1"+
+        "\u0313\1\uffff\1\u0314\1\103\1\u0316\1\u0317\1\uffff\4\103\1\uffff"+
+        "\5\103\1\u0322\1\uffff\1\103\2\uffff\5\103\1\uffff\1\u0329\2\103"+
+        "\1\u032c\1\uffff\2\103\1\uffff\1\u032f\1\103\1\uffff\1\u0331\2\103"+
+        "\1\u0334\1\103\1\u0336\1\u0337\2\103\1\uffff\4\103\1\uffff\3\103"+
+        "\1\u0341\1\uffff\1\103\1\u0343\3\103\1\uffff\1\u0347\1\uffff\1\103"+
+        "\1\u0349\10\103\2\uffff\1\103\1\u0353\2\103\1\u0356\1\u0357\1\103"+
+        "\1\uffff\1\u0359\2\103\1\uffff\2\103\1\uffff\7\103\1\u0366\1\uffff"+
+        "\1\u0367\2\103\1\u036a\2\103\1\u036d\1\u036e\2\103\1\u0371\1\u0372"+
+        "\5\uffff\2\103\1\uffff\1\u0375\1\u0376\1\u037b\7\103\1\uffff\1\103"+
+        "\3\uffff\1\103\2\uffff\5\103\1\u038a\4\103\1\uffff\1\u0390\5\103"+
+        "\1\uffff\1\103\1\u0398\1\uffff\1\u0399\1\103\1\uffff\1\u039b\1\uffff"+
+        "\2\103\1\uffff\1\103\2\uffff\1\u03a0\3\103\1\u03a4\1\103\1\u03a7"+
+        "\2\103\1\uffff\1\103\1\uffff\1\103\1\u03ac\1\103\1\uffff\1\103\1"+
+        "\uffff\11\103\1\uffff\2\103\2\uffff\1\u03bd\1\uffff\5\103\1\u03c3"+
+        "\6\103\2\uffff\1\u03cd\1\103\1\uffff\1\u03cf\1\u03d0\2\uffff\2\103"+
+        "\2\uffff\1\u03d3\1\u03d4\2\uffff\4\103\1\uffff\2\103\1\u03dc\5\103"+
+        "\1\u03e3\5\103\1\uffff\4\103\1\u03ee\1\uffff\5\103\1\u03f4\1\103"+
+        "\2\uffff\1\103\1\uffff\1\u03f7\1\103\1\u03f9\1\103\1\uffff\3\103"+
+        "\1\uffff\1\103\1\u03ff\1\uffff\3\103\1\u0403\1\uffff\17\103\1\u0415"+
+        "\1\uffff\5\103\1\uffff\4\103\1\u041f\3\103\1\u0423\1\uffff\1\103"+
+        "\2\uffff\2\103\2\uffff\7\103\1\uffff\5\103\1\u0435\1\uffff\12\103"+
+        "\1\uffff\3\103\1\u0443\1\103\1\uffff\1\103\1\u0446\1\uffff\1\103"+
+        "\1\uffff\5\103\1\uffff\1\103\1\u044e\1\u044f\1\uffff\1\u0450\14"+
+        "\103\1\u045d\3\103\1\uffff\1\u0461\1\u0462\7\103\1\uffff\1\103\1"+
+        "\u046b\1\u046c\1\uffff\2\103\1\u046f\13\103\1\u047b\1\u047c\1\103"+
+        "\1\uffff\1\103\1\uffff\6\103\1\u0485\4\103\1\uffff\1\u048a\1\103"+
+        "\1\uffff\4\103\1\u0490\1\u0491\1\u0492\3\uffff\12\103\1\u049d\1"+
+        "\u049f\1\uffff\3\103\2\uffff\7\103\1\u04aa\2\uffff\2\103\1\uffff"+
+        "\1\u04ad\7\103\1\u04b5\1\u04b6\1\u04b7\2\uffff\2\103\1\u04ba\3\103"+
+        "\1\u04bf\1\103\1\uffff\4\103\1\uffff\3\103\1\u04c8\1\103\3\uffff"+
+        "\2\103\1\u04cc\7\103\1\uffff\1\103\1\uffff\1\103\1\u04d7\2\103\1"+
+        "\u04da\3\103\1\u04de\1\103\1\uffff\1\u04e0\1\u04e1\1\uffff\1\u04e2"+
+        "\5\103\1\u04e8\3\uffff\1\u04e9\1\u04ea\1\uffff\4\103\1\uffff\1\u04ef"+
+        "\1\103\1\u04f1\1\u04f2\4\103\1\uffff\1\u04f7\1\u04f8\1\103\1\uffff"+
+        "\3\103\1\u04fd\3\103\1\u0502\1\u0503\1\u0504\1\uffff\1\103\1\u0506"+
+        "\1\uffff\1\u0507\2\103\1\uffff\1\103\3\uffff\5\103\3\uffff\1\u0510"+
+        "\1\103\1\u0512\1\u0513\1\uffff\1\u0514\2\uffff\1\103\1\u0516\1\u0517"+
+        "\1\103\2\uffff\4\103\1\uffff\1\103\1\u051e\2\103\3\uffff\1\103\2"+
+        "\uffff\1\u0522\7\103\1\uffff\1\103\3\uffff\1\103\2\uffff\1\u052c"+
+        "\5\103\1\uffff\1\103\1\u0533\1\u0534\1\uffff\4\103\1\u0539\1\103"+
+        "\1\u053b\2\103\1\uffff\1\103\1\u053f\1\u0540\2\103\1\u0543\2\uffff"+
+        "\1\103\1\u0545\2\103\1\uffff\1\103\1\uffff\1\u0549\1\103\1\u054b"+
+        "\2\uffff\1\103\1\u054d\1\uffff\1\103\1\uffff\3\103\1\uffff\1\103"+
+        "\1\uffff\1\103\1\uffff\1\u0554\1\u0555\2\103\1\u0558\1\103\2\uffff"+
+        "\1\103\1\u055b\1\uffff\1\u055c\1\u055d\3\uffff";
+    static final String DFA21_eofS =
+        "\u055e\uffff";
+    static final String DFA21_minS =
+        "\1\0\1\141\2\uffff\1\143\2\141\1\144\2\141\2\145\1\uffff\1\143"+
+        "\1\145\1\141\1\145\3\141\1\143\1\141\2\uffff\1\56\1\53\1\uffff\2"+
+        "\141\1\52\1\55\1\75\3\uffff\1\52\1\75\1\76\1\75\1\174\1\46\1\75"+
+        "\1\56\1\72\1\uffff\1\157\1\156\1\157\1\141\1\164\1\156\1\141\1\162"+
+        "\2\60\1\44\5\uffff\1\143\1\151\2\162\1\141\1\146\3\uffff\1\141\1"+
+        "\150\1\141\1\151\1\160\1\156\1\146\1\163\1\164\1\157\1\44\1\156"+
+        "\1\157\1\145\1\162\1\154\2\44\1\141\1\44\1\110\1\146\1\145\1\163"+
+        "\1\164\1\162\1\156\1\144\2\145\1\162\1\160\1\141\1\170\1\160\1\162"+
+        "\1\44\1\171\1\uffff\1\144\1\164\1\44\1\164\1\141\1\164\1\61\1\151"+
+        "\1\162\1\164\1\167\2\147\1\151\1\163\1\155\1\154\1\144\1\151\1\154"+
+        "\1\162\1\145\1\101\1\106\1\150\1\143\1\162\1\155\1\167\1\154\1\156"+
+        "\2\uffff\1\74\5\uffff\1\163\1\154\1\156\1\171\1\146\7\uffff\1\75"+
+        "\23\uffff\1\75\7\uffff\1\157\1\164\1\156\1\165\1\164\1\162\1\147"+
+        "\1\144\1\44\1\162\1\156\1\143\1\uffff\1\60\4\uffff\1\153\1\155\1"+
+        "\156\1\164\1\120\1\151\1\143\1\64\1\164\1\162\1\157\1\145\1\44\1"+
+        "\162\1\144\1\164\1\145\2\143\1\151\2\141\1\160\1\141\1\44\1\156"+
+        "\1\uffff\1\143\1\155\1\154\1\141\1\145\1\44\1\163\1\164\1\145\1"+
+        "\151\1\164\1\uffff\1\156\1\uffff\1\147\1\157\1\uffff\1\157\1\164"+
+        "\1\44\1\156\2\145\1\157\1\61\1\146\1\165\1\145\2\141\1\163\1\164"+
+        "\1\145\1\143\1\147\1\156\1\145\1\44\1\164\1\145\1\157\1\uffff\2"+
+        "\44\2\151\1\uffff\1\145\1\162\1\44\1\144\1\156\2\143\1\164\1\44"+
+        "\1\151\1\162\1\157\1\145\1\150\1\147\1\164\1\141\1\146\1\164\1\144"+
+        "\1\150\1\154\1\156\1\153\1\161\1\151\1\156\1\145\1\155\1\141\1\145"+
+        "\1\141\1\142\1\145\1\44\1\154\1\145\1\155\2\uffff\1\151\2\44\1\145"+
+        "\1\157\1\164\4\uffff\1\154\1\145\1\147\1\142\1\145\1\151\1\147\1"+
+        "\145\1\141\1\146\1\uffff\1\143\1\61\1\157\1\141\1\145\1\164\1\44"+
+        "\1\162\1\160\1\145\1\61\2\145\1\154\1\144\1\uffff\1\143\1\44\1\143"+
+        "\1\162\1\150\2\162\1\143\1\171\1\165\1\154\1\44\1\uffff\1\44\1\164"+
+        "\1\44\1\144\1\154\1\144\1\uffff\1\145\1\44\1\162\1\163\1\141\1\164"+
+        "\1\145\1\162\1\165\1\164\1\uffff\1\164\1\44\1\156\1\162\1\44\1\62"+
+        "\1\162\1\151\1\155\1\61\1\162\1\164\1\157\1\151\1\104\1\44\1\150"+
+        "\1\147\1\163\2\44\1\uffff\2\44\1\167\1\164\1\141\1\157\2\uffff\1"+
+        "\157\1\163\1\143\1\144\1\120\1\157\1\163\1\162\1\143\1\162\1\uffff"+
+        "\1\141\2\153\2\157\1\uffff\1\163\1\151\1\162\1\166\1\162\1\164\1"+
+        "\150\1\44\1\156\1\142\1\150\1\157\1\44\1\145\1\151\1\44\1\165\1"+
+        "\143\1\104\1\141\1\143\1\157\1\151\1\162\3\44\1\uffff\2\44\1\141"+
+        "\1\142\2\uffff\1\104\1\165\1\44\1\145\1\147\1\44\1\154\1\44\1\156"+
+        "\1\145\1\162\2\44\1\137\1\61\1\64\1\157\1\44\1\63\1\144\1\147\1"+
+        "\156\1\102\1\uffff\1\151\1\150\1\44\1\67\1\44\1\143\1\44\1\154\1"+
+        "\165\1\150\1\uffff\1\150\1\44\1\162\1\151\1\157\1\145\1\44\1\154"+
+        "\1\141\1\162\1\141\2\uffff\1\151\1\uffff\1\44\1\154\2\44\1\141\1"+
+        "\uffff\1\103\1\151\1\156\1\151\1\44\1\164\1\143\1\160\1\44\1\uffff"+
+        "\1\144\1\44\1\163\1\uffff\1\44\1\70\1\157\1\147\1\156\1\142\1\71"+
+        "\1\63\1\62\1\44\1\145\1\162\1\157\1\162\1\uffff\1\44\1\145\1\151"+
+        "\3\uffff\1\146\1\uffff\1\44\1\162\1\144\1\141\1\156\1\164\2\44\1"+
+        "\101\1\167\1\145\1\157\1\145\1\151\1\164\2\44\1\144\1\156\1\164"+
+        "\1\145\1\156\1\145\1\163\1\44\1\164\1\uffff\1\151\1\154\1\44\1\167"+
+        "\1\141\1\uffff\1\44\1\156\1\uffff\1\145\1\157\1\162\1\164\1\145"+
+        "\1\165\1\154\1\44\5\uffff\2\154\1\151\1\164\1\uffff\1\141\1\145"+
+        "\1\uffff\1\145\1\uffff\1\147\1\163\1\154\1\163\2\uffff\1\163\5\44"+
+        "\1\61\1\144\1\uffff\1\44\2\145\1\164\1\141\1\165\1\157\1\145\1\156"+
+        "\1\145\1\uffff\1\44\1\141\1\44\1\uffff\1\44\1\uffff\1\44\1\154\2"+
+        "\44\1\uffff\1\157\1\142\1\171\1\102\1\uffff\1\164\1\171\1\157\1"+
+        "\164\1\157\1\44\1\uffff\1\171\2\uffff\1\154\1\150\1\142\1\143\1"+
+        "\164\1\uffff\1\44\1\150\1\163\1\44\1\uffff\1\163\1\151\1\uffff\1"+
+        "\44\1\163\1\uffff\1\44\1\154\1\165\1\44\1\141\2\44\1\70\1\145\1"+
+        "\uffff\1\127\1\124\1\156\1\141\1\uffff\1\162\1\164\1\141\1\44\1"+
+        "\uffff\1\157\1\44\1\162\1\163\1\151\1\uffff\1\44\1\uffff\1\144\1"+
+        "\44\1\162\1\167\2\145\1\147\2\141\1\145\2\uffff\1\145\1\44\1\145"+
+        "\1\166\2\44\1\145\1\uffff\1\44\1\172\1\157\1\uffff\1\110\1\163\1"+
+        "\uffff\1\147\1\145\1\144\1\141\2\151\1\156\1\44\1\uffff\1\44\1\145"+
+        "\1\163\1\44\1\156\1\162\2\44\1\164\1\151\2\44\5\uffff\1\67\1\145"+
+        "\1\uffff\3\44\1\162\2\164\1\162\1\160\1\164\1\162\1\uffff\1\143"+
+        "\3\uffff\1\145\2\uffff\1\156\1\145\1\164\1\127\1\162\1\44\1\102"+
+        "\1\166\1\162\1\156\1\uffff\1\44\1\105\1\141\1\154\1\145\1\171\1"+
+        "\uffff\1\104\1\44\1\uffff\1\44\1\157\1\uffff\1\44\1\uffff\1\163"+
+        "\1\162\1\uffff\1\162\2\uffff\1\44\1\166\1\151\1\171\1\44\1\167\1"+
+        "\44\1\151\1\164\1\uffff\1\153\1\uffff\1\144\1\44\1\166\1\uffff\1"+
+        "\144\1\uffff\1\101\1\163\1\156\1\145\1\147\1\142\1\164\1\166\1\124"+
+        "\1\uffff\1\162\1\145\2\uffff\1\44\1\uffff\1\145\1\143\1\145\1\151"+
+        "\1\163\1\44\1\106\1\145\1\167\1\157\1\160\1\164\2\uffff\1\44\1\160"+
+        "\1\uffff\2\44\2\uffff\1\124\1\156\2\uffff\2\44\2\uffff\1\160\1\154"+
+        "\1\143\1\145\1\uffff\1\143\1\155\1\44\1\155\1\157\1\145\1\141\1"+
+        "\150\1\44\1\151\1\144\3\151\1\uffff\1\151\1\145\2\151\1\44\1\uffff"+
+        "\1\164\1\166\1\162\1\145\1\157\1\44\1\145\2\uffff\1\156\1\uffff"+
+        "\1\44\1\141\1\44\1\160\1\uffff\1\151\1\156\1\160\1\uffff\1\145\1"+
+        "\44\1\uffff\1\157\2\145\1\44\1\uffff\1\145\1\162\1\147\2\141\1\155"+
+        "\1\145\1\127\1\156\1\145\1\141\2\145\1\171\1\102\1\44\1\uffff\1"+
+        "\144\1\153\1\151\1\144\1\167\1\uffff\1\157\1\145\1\171\1\156\1\44"+
+        "\1\145\1\156\1\164\1\44\1\uffff\1\154\2\uffff\2\145\2\uffff\1\145"+
+        "\1\157\1\153\1\164\1\147\1\157\1\141\1\uffff\1\141\2\162\1\154\1"+
+        "\151\1\44\1\uffff\1\172\1\40\1\157\1\156\1\147\1\164\1\170\1\144"+
+        "\1\170\1\162\1\uffff\1\141\1\145\1\141\1\44\1\146\1\uffff\1\166"+
+        "\1\44\1\uffff\1\164\1\uffff\1\141\1\143\1\144\1\145\1\162\1\uffff"+
+        "\1\156\2\44\1\uffff\1\44\2\145\1\155\2\163\1\151\1\141\1\162\1\151"+
+        "\1\110\2\162\1\44\1\162\1\160\1\151\1\uffff\2\44\1\147\1\164\1\157"+
+        "\1\162\2\160\1\151\1\uffff\1\162\2\44\1\uffff\1\141\1\170\1\44\1"+
+        "\156\1\163\1\156\1\150\1\145\1\151\1\160\1\144\1\160\1\154\1\164"+
+        "\2\44\1\156\1\uffff\1\145\1\uffff\1\156\1\144\1\150\1\155\1\164"+
+        "\1\145\1\44\1\157\1\164\1\156\1\143\1\uffff\1\44\1\151\1\uffff\1"+
+        "\151\1\162\1\145\1\157\3\44\3\uffff\1\163\1\156\1\145\1\163\1\151"+
+        "\1\156\1\151\1\114\1\144\1\145\2\44\1\uffff\1\163\1\145\1\164\2"+
+        "\uffff\2\150\1\162\1\155\2\145\1\164\1\44\2\uffff\1\171\1\164\1"+
+        "\uffff\1\44\1\145\2\157\1\162\1\163\1\157\1\145\3\44\2\uffff\1\145"+
+        "\1\144\1\44\1\157\1\164\1\141\1\44\1\162\1\uffff\1\165\1\145\2\164"+
+        "\1\uffff\1\143\1\157\1\163\1\44\1\167\3\uffff\1\163\1\164\1\44\1"+
+        "\167\2\164\1\154\1\157\1\164\1\151\1\uffff\1\145\1\uffff\1\145\1"+
+        "\44\1\155\1\164\1\44\1\144\2\141\1\44\1\127\1\uffff\2\44\1\uffff"+
+        "\1\44\1\167\1\162\1\163\1\164\1\156\1\44\3\uffff\2\44\1\uffff\1"+
+        "\167\1\156\1\160\1\164\1\uffff\1\44\1\160\2\44\2\145\1\156\1\145"+
+        "\1\uffff\2\44\1\111\1\uffff\1\157\1\151\1\123\1\44\1\143\1\150\1"+
+        "\147\3\44\1\uffff\1\141\1\44\1\uffff\1\44\2\164\1\uffff\1\141\3"+
+        "\uffff\1\154\1\151\1\141\1\162\1\163\3\uffff\1\44\1\145\2\44\1\uffff"+
+        "\1\44\2\uffff\1\162\2\44\1\144\2\uffff\1\156\1\162\1\157\1\145\1"+
+        "\uffff\1\141\1\44\1\150\1\163\3\uffff\1\160\2\uffff\1\44\1\127\1"+
+        "\151\1\145\1\172\1\154\1\141\1\145\1\uffff\1\163\3\uffff\1\127\2"+
+        "\uffff\1\44\1\146\1\144\1\156\1\162\1\154\1\uffff\1\164\2\44\1\uffff"+
+        "\1\141\1\164\1\144\1\141\1\44\1\164\1\44\1\163\1\141\1\uffff\1\157"+
+        "\2\44\1\166\1\145\1\44\2\uffff\1\151\1\44\1\147\1\164\1\uffff\1"+
+        "\151\1\uffff\1\44\1\151\1\44\2\uffff\1\151\1\44\1\uffff\1\164\1"+
+        "\uffff\1\145\1\151\1\157\1\uffff\1\164\1\uffff\1\143\1\uffff\2\44"+
+        "\1\157\1\156\1\44\1\145\2\uffff\1\156\1\44\1\uffff\2\44\3\uffff";
+    static final String DFA21_maxS =
+        "\1\uffff\1\162\2\uffff\1\171\1\164\1\165\1\164\1\170\1\165\1\171"+
+        "\1\145\1\uffff\1\172\2\165\1\157\1\165\1\151\1\141\1\164\1\165\2"+
+        "\uffff\1\56\1\75\1\uffff\2\151\1\75\2\76\3\uffff\2\75\1\76\1\75"+
+        "\1\174\1\46\1\75\2\72\1\uffff\1\157\1\156\2\157\1\165\1\161\1\141"+
+        "\1\162\1\170\1\154\1\172\5\uffff\1\171\1\151\1\163\1\162\1\141\1"+
+        "\146\3\uffff\1\157\1\162\1\164\1\151\1\160\1\156\1\166\1\163\1\164"+
+        "\1\157\1\172\1\156\1\157\1\170\1\162\1\154\2\172\1\160\1\172\1\124"+
+        "\1\146\1\145\1\163\1\164\1\162\2\156\2\145\1\162\1\164\1\171\1\170"+
+        "\1\160\1\162\1\172\1\171\1\uffff\1\144\1\164\1\172\1\164\1\141\1"+
+        "\164\1\61\1\157\1\162\1\164\1\167\1\166\1\147\1\151\1\163\1\155"+
+        "\1\154\1\164\1\151\1\162\1\170\1\145\1\122\1\106\1\150\1\143\1\162"+
+        "\1\155\1\167\1\154\1\162\2\uffff\1\74\5\uffff\1\163\1\162\1\156"+
+        "\1\171\1\146\7\uffff\1\75\23\uffff\1\75\7\uffff\1\157\1\164\1\156"+
+        "\1\165\1\164\1\162\1\147\1\144\1\172\1\162\1\156\1\143\1\uffff\1"+
+        "\154\4\uffff\1\153\1\155\1\156\1\164\1\120\1\151\1\143\1\64\1\164"+
+        "\1\162\1\157\1\145\1\172\1\162\1\144\1\164\1\145\1\143\1\164\1\151"+
+        "\2\141\1\160\1\141\1\172\1\156\1\uffff\1\143\1\155\1\154\1\141\1"+
+        "\145\1\172\1\163\1\164\1\145\1\151\1\164\1\uffff\1\156\1\uffff\1"+
+        "\147\1\157\1\uffff\1\157\1\164\1\172\1\156\2\145\1\157\1\70\1\164"+
+        "\1\165\1\145\2\141\1\163\1\164\1\150\1\143\1\147\1\171\1\145\1\172"+
+        "\1\164\1\145\1\157\1\uffff\2\172\2\151\1\uffff\1\145\1\162\1\172"+
+        "\1\144\1\156\2\143\1\164\1\172\1\151\1\165\1\157\1\145\1\150\1\147"+
+        "\1\164\1\141\1\146\1\164\1\144\1\150\1\154\1\156\1\153\1\161\1\151"+
+        "\1\162\1\145\1\155\1\141\1\145\1\141\1\142\1\145\1\172\1\154\1\145"+
+        "\1\155\2\uffff\1\151\2\172\1\145\1\157\1\164\4\uffff\1\154\1\145"+
+        "\1\147\1\142\1\145\1\151\1\147\2\145\1\146\1\uffff\1\143\1\70\1"+
+        "\157\1\141\1\145\1\164\1\172\1\162\1\160\1\145\1\61\1\151\1\145"+
+        "\1\154\1\144\1\uffff\1\143\1\172\1\143\1\162\1\150\2\162\1\143\1"+
+        "\171\1\165\1\154\1\172\1\uffff\1\172\1\164\1\172\1\144\1\154\1\144"+
+        "\1\uffff\1\145\1\172\1\162\1\163\1\141\1\164\1\145\1\162\1\165\1"+
+        "\164\1\uffff\1\164\1\172\1\156\1\162\1\172\1\63\1\162\1\151\1\155"+
+        "\1\141\1\162\1\164\1\157\1\151\1\104\1\172\1\150\1\147\1\163\2\172"+
+        "\1\uffff\2\172\1\167\1\164\1\141\1\157\2\uffff\1\157\1\163\1\143"+
+        "\1\144\1\120\1\157\1\163\1\162\1\143\1\162\1\uffff\1\141\2\153\2"+
+        "\157\1\uffff\1\163\1\151\1\162\1\166\1\162\1\164\1\150\1\172\1\156"+
+        "\1\142\1\150\1\157\1\172\1\145\1\151\1\172\1\165\1\143\1\104\1\141"+
+        "\1\143\1\157\1\151\1\162\3\172\1\uffff\2\172\1\141\1\142\2\uffff"+
+        "\1\104\1\165\1\172\1\145\1\147\1\172\1\154\1\172\1\156\1\145\1\162"+
+        "\2\172\1\137\1\65\1\64\1\157\1\172\1\63\1\144\1\147\1\156\1\122"+
+        "\1\uffff\1\151\1\150\1\172\1\67\1\172\1\143\1\172\1\154\1\165\1"+
+        "\150\1\uffff\1\150\1\172\1\162\1\151\1\157\1\145\1\172\1\154\1\141"+
+        "\1\162\1\141\2\uffff\1\151\1\uffff\1\172\1\154\2\172\1\141\1\uffff"+
+        "\1\103\1\151\1\156\1\151\1\172\1\164\1\143\1\160\1\172\1\uffff\1"+
+        "\163\1\172\1\163\1\uffff\1\172\1\70\1\157\1\147\1\156\1\142\1\71"+
+        "\1\63\1\62\1\172\1\145\1\162\1\157\1\162\1\uffff\1\172\1\145\1\154"+
+        "\3\uffff\1\146\1\uffff\1\172\1\162\1\144\1\141\1\156\1\164\2\172"+
+        "\1\101\1\167\1\145\1\157\1\162\1\151\1\164\2\172\1\144\1\156\1\164"+
+        "\1\145\1\156\1\145\1\163\1\172\1\164\1\uffff\1\151\1\154\1\172\1"+
+        "\167\1\141\1\uffff\1\172\1\156\1\uffff\1\145\1\157\1\162\1\164\1"+
+        "\145\1\165\1\154\1\172\5\uffff\2\154\1\151\1\164\1\uffff\1\141\1"+
+        "\145\1\uffff\1\145\1\uffff\1\147\1\163\1\154\1\163\2\uffff\1\163"+
+        "\5\172\1\61\1\144\1\uffff\1\172\2\145\1\164\1\151\1\165\1\157\1"+
+        "\145\1\156\1\145\1\uffff\1\172\1\141\1\172\1\uffff\1\172\1\uffff"+
+        "\1\172\1\154\2\172\1\uffff\1\157\1\160\1\171\1\102\1\uffff\1\164"+
+        "\1\171\1\157\1\164\1\157\1\172\1\uffff\1\171\2\uffff\1\154\1\150"+
+        "\1\142\1\143\1\164\1\uffff\1\172\1\150\1\163\1\172\1\uffff\1\163"+
+        "\1\151\1\uffff\1\172\1\163\1\uffff\1\172\1\154\1\165\1\172\1\141"+
+        "\2\172\1\70\1\145\1\uffff\1\127\1\124\1\156\1\141\1\uffff\1\162"+
+        "\1\164\1\141\1\172\1\uffff\1\157\1\172\1\162\1\163\1\151\1\uffff"+
+        "\1\172\1\uffff\1\144\1\172\1\162\1\167\2\145\1\147\2\141\1\145\2"+
+        "\uffff\1\145\1\172\1\145\1\166\2\172\1\145\1\uffff\2\172\1\157\1"+
+        "\uffff\1\127\1\163\1\uffff\1\147\1\145\1\144\1\141\2\151\1\156\1"+
+        "\172\1\uffff\1\172\1\145\1\163\1\172\1\156\1\162\2\172\1\164\1\151"+
+        "\2\172\5\uffff\1\67\1\145\1\uffff\3\172\1\162\2\164\1\162\1\160"+
+        "\1\164\1\162\1\uffff\1\143\3\uffff\1\145\2\uffff\1\156\1\145\1\164"+
+        "\1\127\1\162\1\172\1\124\1\166\1\162\1\156\1\uffff\1\172\1\123\1"+
+        "\141\1\154\1\145\1\171\1\uffff\1\104\1\172\1\uffff\1\172\1\157\1"+
+        "\uffff\1\172\1\uffff\1\163\1\162\1\uffff\1\162\2\uffff\1\172\1\166"+
+        "\1\151\1\171\1\172\1\167\1\172\1\151\1\164\1\uffff\1\153\1\uffff"+
+        "\1\144\1\172\1\166\1\uffff\1\144\1\uffff\1\120\1\163\1\156\1\145"+
+        "\1\147\1\142\1\164\1\166\1\124\1\uffff\1\162\1\145\2\uffff\1\172"+
+        "\1\uffff\1\145\1\143\1\145\1\151\1\163\1\172\1\125\1\145\1\167\1"+
+        "\157\1\160\1\164\2\uffff\1\172\1\160\1\uffff\2\172\2\uffff\1\124"+
+        "\1\156\2\uffff\2\172\2\uffff\1\160\1\154\1\165\1\145\1\uffff\1\143"+
+        "\1\155\1\172\1\155\1\157\1\145\1\141\1\150\1\172\1\151\1\144\3\151"+
+        "\1\uffff\1\151\1\145\2\151\1\172\1\uffff\1\164\1\166\1\162\1\145"+
+        "\1\157\1\172\1\145\2\uffff\1\156\1\uffff\1\172\1\141\1\172\1\160"+
+        "\1\uffff\1\151\1\156\1\160\1\uffff\1\145\1\172\1\uffff\1\157\2\145"+
+        "\1\172\1\uffff\1\145\1\162\1\147\1\141\1\162\1\155\1\145\1\127\1"+
+        "\156\1\145\1\141\2\145\1\171\1\102\1\172\1\uffff\1\144\1\153\1\151"+
+        "\1\144\1\167\1\uffff\1\157\1\145\1\171\1\156\1\172\1\145\1\156\1"+
+        "\164\1\172\1\uffff\1\154\2\uffff\2\145\2\uffff\1\145\1\157\1\153"+
+        "\1\164\1\166\1\157\1\141\1\uffff\1\141\2\162\1\154\1\151\1\172\1"+
+        "\uffff\1\172\1\40\1\157\1\156\1\147\1\164\1\170\1\144\1\170\1\162"+
+        "\1\uffff\1\141\1\145\1\141\1\172\1\146\1\uffff\1\166\1\172\1\uffff"+
+        "\1\164\1\uffff\1\141\1\143\1\144\1\145\1\162\1\uffff\1\156\2\172"+
+        "\1\uffff\1\172\2\145\1\155\2\163\1\151\1\141\1\162\1\151\1\110\2"+
+        "\162\1\172\1\162\1\160\1\151\1\uffff\2\172\1\147\1\164\1\157\1\162"+
+        "\2\160\1\151\1\uffff\1\162\2\172\1\uffff\1\141\1\170\1\172\1\156"+
+        "\1\163\1\156\1\150\1\145\1\151\1\160\1\144\1\160\1\154\1\164\2\172"+
+        "\1\156\1\uffff\1\145\1\uffff\1\156\1\144\1\150\1\155\1\164\1\145"+
+        "\1\172\1\157\1\164\1\156\1\143\1\uffff\1\172\1\151\1\uffff\1\151"+
+        "\1\162\1\145\1\157\3\172\3\uffff\1\163\1\156\1\145\1\163\1\151\1"+
+        "\156\1\151\1\114\1\144\1\145\2\172\1\uffff\1\163\1\145\1\164\2\uffff"+
+        "\2\150\1\162\1\155\2\145\1\164\1\172\2\uffff\1\171\1\164\1\uffff"+
+        "\1\172\1\145\2\157\1\162\1\163\1\157\1\145\3\172\2\uffff\1\145\1"+
+        "\144\1\172\1\157\1\164\1\141\1\172\1\162\1\uffff\1\165\1\145\2\164"+
+        "\1\uffff\1\143\1\157\1\163\1\172\1\167\3\uffff\1\163\1\164\1\172"+
+        "\1\167\2\164\1\154\1\157\1\164\1\151\1\uffff\1\163\1\uffff\1\145"+
+        "\1\172\1\155\1\164\1\172\1\144\2\141\1\172\1\127\1\uffff\2\172\1"+
+        "\uffff\1\172\1\167\1\162\1\163\1\164\1\156\1\172\3\uffff\2\172\1"+
+        "\uffff\1\167\1\156\1\160\1\164\1\uffff\1\172\1\160\2\172\2\145\1"+
+        "\156\1\145\1\uffff\2\172\1\111\1\uffff\1\157\1\151\1\123\1\172\1"+
+        "\143\1\150\1\147\3\172\1\uffff\1\141\1\172\1\uffff\1\172\2\164\1"+
+        "\uffff\1\141\3\uffff\1\154\1\151\1\141\1\162\1\163\3\uffff\1\172"+
+        "\1\145\2\172\1\uffff\1\172\2\uffff\1\162\2\172\1\144\2\uffff\1\156"+
+        "\1\162\1\157\1\145\1\uffff\1\141\1\172\1\150\1\163\3\uffff\1\160"+
+        "\2\uffff\1\172\1\127\1\151\1\145\1\172\1\154\1\141\1\145\1\uffff"+
+        "\1\163\3\uffff\1\127\2\uffff\1\172\1\146\1\144\1\156\1\162\1\154"+
+        "\1\uffff\1\164\2\172\1\uffff\1\141\1\164\1\144\1\141\1\172\1\164"+
+        "\1\172\1\163\1\141\1\uffff\1\157\2\172\1\166\1\145\1\172\2\uffff"+
+        "\1\151\1\172\1\147\1\164\1\uffff\1\151\1\uffff\1\172\1\151\1\172"+
+        "\2\uffff\1\151\1\172\1\uffff\1\164\1\uffff\1\145\1\151\1\157\1\uffff"+
+        "\1\164\1\uffff\1\143\1\uffff\2\172\1\157\1\156\1\172\1\145\2\uffff"+
+        "\1\156\1\172\1\uffff\2\172\3\uffff";
+    static final String DFA21_acceptS =
+        "\2\uffff\1\2\1\3\10\uffff\1\21\11\uffff\1\110\1\111\2\uffff\1\127"+
+        "\5\uffff\1\164\1\165\1\166\11\uffff\1\u0096\13\uffff\1\u0106\2\u0107"+
+        "\1\u010a\1\u010b\6\uffff\1\u0106\1\2\1\3\46\uffff\1\21\37\uffff"+
+        "\1\110\1\111\1\uffff\1\121\1\167\1\u0091\1\125\1\127\5\uffff\1\171"+
+        "\1\u008c\1\161\1\170\1\u0086\1\u0092\1\162\1\uffff\1\u0089\1\163"+
+        "\1\164\1\165\1\166\1\172\1\u0108\1\u0109\1\u008d\1\173\1\u008e\1"+
+        "\u008a\1\174\1\176\1\175\1\177\1\u0095\1\u0080\1\u00b2\1\uffff\1"+
+        "\u008f\1\u008b\1\u0094\1\u00b1\1\u0093\1\u009a\1\u0096\14\uffff"+
+        "\1\u0103\1\uffff\1\u0104\1\u0105\1\u0107\1\u010a\32\uffff\1\u009f"+
+        "\13\uffff\1\137\1\uffff\1\44\2\uffff\1\u0097\30\uffff\1\u00e5\4"+
+        "\uffff\1\u0090\46\uffff\1\u0087\1\u0088\6\uffff\1\u0083\1\u0081"+
+        "\1\u0084\1\u0082\12\uffff\1\u00d6\17\uffff\1\130\14\uffff\1\124"+
+        "\6\uffff\1\u009d\12\uffff\1\u00e6\25\uffff\1\u00ad\6\uffff\1\153"+
+        "\1\22\12\uffff\1\126\5\uffff\1\32\33\uffff\1\u00a6\4\uffff\1\u00a0"+
+        "\1\u00a1\27\uffff\1\72\12\uffff\1\157\13\uffff\1\61\1\u00d7\1\uffff"+
+        "\1\105\5\uffff\1\u00da\11\uffff\1\u0098\3\uffff\1\u00e2\16\uffff"+
+        "\1\u009c\3\uffff\1\u00cc\1\u00a8\1\46\1\uffff\1\47\32\uffff\1\71"+
+        "\5\uffff\1\120\2\uffff\1\u00db\10\uffff\1\u00f5\1\u00f6\1\67\1\u00a9"+
+        "\1\u00ce\4\uffff\1\u00d8\2\uffff\1\u00b5\1\uffff\1\u00b8\4\uffff"+
+        "\1\u00df\1\u00e0\10\uffff\1\u00e1\12\uffff\1\u00dc\3\uffff\1\15"+
+        "\1\uffff\1\117\4\uffff\1\u00a5\4\uffff\1\156\6\uffff\1\154\1\uffff"+
+        "\1\u00cf\1\u00a7\5\uffff\1\135\4\uffff\1\14\2\uffff\1\u00cb\2\uffff"+
+        "\1\u00e4\11\uffff\1\131\4\uffff\1\u00b0\4\uffff\1\u00ab\5\uffff"+
+        "\1\u0101\1\uffff\1\112\12\uffff\1\u00d5\1\u00d0\7\uffff\1\u00d9"+
+        "\3\uffff\1\35\2\uffff\1\u009e\10\uffff\1\u00d4\14\uffff\1\u00ed"+
+        "\1\u00ee\1\u00ef\1\u00f0\1\u00f1\2\uffff\1\u00e3\12\uffff\1\u00fc"+
+        "\1\uffff\1\13\1\u00a3\1\56\1\uffff\1\136\1\u0099\12\uffff\1\142"+
+        "\6\uffff\1\160\2\uffff\1\11\2\uffff\1\u00f2\1\uffff\1\u00f4\2\uffff"+
+        "\1\33\1\uffff\1\u00e8\1\u00e9\11\uffff\1\u00aa\1\uffff\1\141\3\uffff"+
+        "\1\24\1\uffff\1\u00bc\11\uffff\1\152\2\uffff\1\u00ac\1\132\1\uffff"+
+        "\1\34\14\uffff\1\113\1\u00dd\2\uffff\1\155\2\uffff\1\u00b6\1\u00b7"+
+        "\2\uffff\1\u00eb\1\u00ec\2\uffff\1\u00ff\1\1\4\uffff\1\150\16\uffff"+
+        "\1\u009b\5\uffff\1\u00ae\7\uffff\1\u00bf\1\u00a2\1\uffff\1\u00f3"+
+        "\4\uffff\1\u00ea\3\uffff\1\114\2\uffff\1\23\4\uffff\1\25\20\uffff"+
+        "\1\u00d3\5\uffff\1\u00ca\11\uffff\1\133\1\uffff\1\u00b3\1\u00b4"+
+        "\2\uffff\1\u0102\1\u0100\7\uffff\1\64\6\uffff\1\140\12\uffff\1\116"+
+        "\5\uffff\1\17\2\uffff\1\12\1\uffff\1\u00e7\5\uffff\1\16\3\uffff"+
+        "\1\u00ba\21\uffff\1\122\11\uffff\1\u00fd\3\uffff\1\103\21\uffff"+
+        "\1\144\1\uffff\1\5\13\uffff\1\134\2\uffff\1\u00a4\7\uffff\1\123"+
+        "\1\20\1\u00cd\14\uffff\1\27\3\uffff\1\u00c9\1\u00d1\10\uffff\1\107"+
+        "\1\77\2\uffff\1\u00d2\13\uffff\1\146\1\151\10\uffff\1\u00fe\4\uffff"+
+        "\1\u0085\5\uffff\1\40\1\147\1\26\12\uffff\1\u00c8\1\uffff\1\u00f8"+
+        "\12\uffff\1\57\2\uffff\1\70\7\uffff\1\63\1\65\1\106\2\uffff\1\115"+
+        "\4\uffff\1\45\10\uffff\1\30\3\uffff\1\u00c1\12\uffff\1\62\2\uffff"+
+        "\1\37\3\uffff\1\54\1\uffff\1\145\1\u00b9\1\73\5\uffff\1\60\1\4\1"+
+        "\u00af\4\uffff\1\143\1\uffff\1\7\1\10\4\uffff\1\31\1\u00bb\4\uffff"+
+        "\1\u00c3\4\uffff\1\u00f9\1\u00fa\1\u00de\1\uffff\1\36\1\76\10\uffff"+
+        "\1\41\1\uffff\1\43\1\50\1\6\1\uffff\1\u00be\1\101\6\uffff\1\u00c6"+
+        "\3\uffff\1\52\11\uffff\1\u00f7\6\uffff\1\u00fb\1\66\4\uffff\1\75"+
+        "\1\uffff\1\104\3\uffff\1\u00c2\1\u00c4\2\uffff\1\u00c7\1\uffff\1"+
+        "\55\3\uffff\1\42\1\uffff\1\u00bd\1\uffff\1\u00c0\6\uffff\1\53\1"+
+        "\74\2\uffff\1\51\2\uffff\1\100\1\u00c5\1\102";
+    static final String DFA21_specialS =
+        "\1\0\u055d\uffff}>";
+    static final String[] DFA21_transitionS = {
+            "\11\74\2\73\2\74\1\73\22\74\1\73\1\51\1\71\1\40\1\70\1\44\1"+
+            "\50\1\72\1\26\1\27\1\35\1\31\1\32\1\36\1\30\1\43\1\65\11\66"+
+            "\1\53\1\54\1\45\1\37\1\46\1\52\1\14\1\70\1\55\1\70\1\60\4\70"+
+            "\1\56\2\70\1\57\6\70\1\61\7\70\1\41\1\74\1\42\1\67\1\70\1\74"+
+            "\1\15\1\17\1\11\1\5\1\10\1\6\1\16\1\21\1\7\1\63\1\13\1\34\1"+
+            "\23\1\25\1\24\1\1\1\64\1\20\1\4\1\12\1\62\1\33\1\22\3\70\1\2"+
+            "\1\47\1\3\uff82\74",
+            "\1\75\2\uffff\1\102\1\100\6\uffff\1\101\2\uffff\1\77\2\uffff"+
+            "\1\76",
+            "",
+            "",
+            "\1\107\1\uffff\1\110\16\uffff\1\106\1\112\1\uffff\1\111\1"+
+            "\uffff\1\113",
+            "\1\116\3\uffff\1\114\3\uffff\1\115\5\uffff\1\120\4\uffff\1"+
+            "\117",
+            "\1\125\7\uffff\1\123\5\uffff\1\124\2\uffff\1\122\2\uffff\1"+
+            "\121",
+            "\1\127\1\uffff\1\131\6\uffff\1\130\1\126\4\uffff\1\132\1\133",
+            "\1\140\12\uffff\1\135\5\uffff\1\137\3\uffff\1\134\1\uffff"+
+            "\1\136",
+            "\1\145\12\uffff\1\142\2\uffff\1\141\2\uffff\1\143\2\uffff"+
+            "\1\144",
+            "\1\147\1\152\1\uffff\1\151\11\uffff\1\146\6\uffff\1\150",
+            "\1\153",
+            "",
+            "\1\156\12\uffff\1\155\4\uffff\1\157\6\uffff\1\160",
+            "\1\162\15\uffff\1\163\1\uffff\1\161",
+            "\1\165\12\uffff\1\164\10\uffff\1\166",
+            "\1\170\3\uffff\1\171\5\uffff\1\167",
+            "\1\175\3\uffff\1\172\11\uffff\1\173\5\uffff\1\174",
+            "\1\u0080\6\uffff\1\177\1\176",
+            "\1\u0081",
+            "\1\u0087\2\uffff\1\u0083\7\uffff\1\u0084\1\uffff\1\u0082\1"+
+            "\uffff\1\u0086\1\uffff\1\u0085",
+            "\1\u0088\3\uffff\1\u0089\11\uffff\1\u008b\5\uffff\1\u008a",
+            "",
+            "",
+            "\1\u008e",
+            "\1\u0091\21\uffff\1\u0090",
+            "",
+            "\1\u0095\7\uffff\1\u0094",
+            "\1\u0097\3\uffff\1\u0098\3\uffff\1\u0096",
+            "\1\u009a\22\uffff\1\u0099",
+            "\1\u009e\17\uffff\1\u009c\1\u009d",
+            "\1\u00a0\1\u00a1",
+            "",
+            "",
+            "",
+            "\1\u00a7\4\uffff\1\u00a8\15\uffff\1\u00a6",
+            "\1\u00aa",
+            "\1\u00ac",
+            "\1\u00ae",
+            "\1\u00b0",
+            "\1\u00b2",
+            "\1\u00b4",
+            "\1\u00b7\13\uffff\1\u00b6",
+            "\1\u00b9",
+            "",
+            "\1\u00bc",
+            "\1\u00bd",
+            "\1\u00be",
+            "\1\u00c0\15\uffff\1\u00bf",
+            "\1\u00c1\1\u00c2",
+            "\1\u00c3\1\uffff\1\u00c4\1\u00c5",
+            "\1\u00c6",
+            "\1\u00c7",
+            "\12\u00c9\10\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1\u00cb"+
+            "\13\uffff\1\u00c8\6\uffff\1\u00c9\2\uffff\1\u00cb\1\uffff\3"+
+            "\u00cb\5\uffff\1\u00cb\13\uffff\1\u00c8",
+            "\12\u00c9\10\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1\u00cb"+
+            "\22\uffff\1\u00c9\2\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1"+
+            "\u00cb",
+            "\1\103\34\uffff\32\103\4\uffff\1\103\1\uffff\32\103",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00ce\25\uffff\1\u00cf",
+            "\1\u00d0",
+            "\1\u00d1\1\u00d2",
+            "\1\u00d3",
+            "\1\u00d4",
+            "\1\u00d5",
+            "",
+            "",
+            "",
+            "\1\u00d6\15\uffff\1\u00d7",
+            "\1\u00d9\11\uffff\1\u00d8",
+            "\1\u00db\14\uffff\1\u00dc\5\uffff\1\u00da",
+            "\1\u00dd",
+            "\1\u00de",
+            "\1\u00df",
+            "\1\u00e3\5\uffff\1\u00e2\6\uffff\1\u00e0\2\uffff\1\u00e1",
+            "\1\u00e4",
+            "\1\u00e5",
+            "\1\u00e6",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\26\103\1\u00e7\3\103",
+            "\1\u00e9",
+            "\1\u00ea",
+            "\1\u00eb\10\uffff\1\u00ec\11\uffff\1\u00ed",
+            "\1\u00ee",
+            "\1\u00ef",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\10\103\1\u00f0\11\103\1\u00f3\1\u00f1\1\103\1\u00f2\4\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\4\103\1\u00f5\25\103",
+            "\1\u00f7\16\uffff\1\u00f8",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u00fb\13\uffff\1\u00fa",
+            "\1\u00fc",
+            "\1\u00fd",
+            "\1\u00fe",
+            "\1\u00ff",
+            "\1\u0100",
+            "\1\u0101",
+            "\1\u0104\7\uffff\1\u0103\1\uffff\1\u0102",
+            "\1\u0105",
+            "\1\u0106",
+            "\1\u0107",
+            "\1\u0108\2\uffff\1\u0109\1\u010a",
+            "\1\u010c\7\uffff\1\u010b\13\uffff\1\u010d\3\uffff\1\u010e",
+            "\1\u010f",
+            "\1\u0110",
+            "\1\u0111",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0113",
+            "",
+            "\1\u0114",
+            "\1\u0115",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\22\103\1\u0116\7\103",
+            "\1\u0118",
+            "\1\u0119",
+            "\1\u011a",
+            "\1\u011b",
+            "\1\u011c\5\uffff\1\u011d",
+            "\1\u011e",
+            "\1\u011f",
+            "\1\u0120",
+            "\1\u0121\5\uffff\1\u0123\6\uffff\1\u0122\1\uffff\1\u0124",
+            "\1\u0125",
+            "\1\u0126",
+            "\1\u0127",
+            "\1\u0128",
+            "\1\u0129",
+            "\1\u012a\11\uffff\1\u012b\5\uffff\1\u012c",
+            "\1\u012d",
+            "\1\u012f\5\uffff\1\u012e",
+            "\1\u0130\5\uffff\1\u0131",
+            "\1\u0132",
+            "\1\u0134\20\uffff\1\u0133",
+            "\1\u0135",
+            "\1\u0136",
+            "\1\u0137",
+            "\1\u0138",
+            "\1\u0139",
+            "\1\u013a",
+            "\1\u013b",
+            "\1\u013c\3\uffff\1\u013d",
+            "",
+            "",
+            "\1\u013e",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0140",
+            "\1\u0142\5\uffff\1\u0141",
+            "\1\u0143",
+            "\1\u0144",
+            "\1\u0145",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0146",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0148",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u014a",
+            "\1\u014b",
+            "\1\u014c",
+            "\1\u014d",
+            "\1\u014e",
+            "\1\u014f",
+            "\1\u0150",
+            "\1\u0151",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\2\103\1\u0152\1\u0153\26\103",
+            "\1\u0155",
+            "\1\u0156",
+            "\1\u0157",
+            "",
+            "\12\u00c9\10\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1\u00cb"+
+            "\22\uffff\1\u00c9\2\uffff\1\u00cb\1\uffff\3\u00cb\5\uffff\1"+
+            "\u00cb",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0158",
+            "\1\u0159",
+            "\1\u015a",
+            "\1\u015b",
+            "\1\u015c",
+            "\1\u015d",
+            "\1\u015e",
+            "\1\u015f",
+            "\1\u0160",
+            "\1\u0161",
+            "\1\u0162",
+            "\1\u0163",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0165",
+            "\1\u0166",
+            "\1\u0167",
+            "\1\u0168",
+            "\1\u0169",
+            "\1\u016a\20\uffff\1\u016b",
+            "\1\u016c",
+            "\1\u016d",
+            "\1\u016e",
+            "\1\u016f",
+            "\1\u0170",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0172",
+            "",
+            "\1\u0173",
+            "\1\u0174",
+            "\1\u0175",
+            "\1\u0176",
+            "\1\u0177",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0179",
+            "\1\u017a",
+            "\1\u017b",
+            "\1\u017c",
+            "\1\u017d",
+            "",
+            "\1\u017e",
+            "",
+            "\1\u017f",
+            "\1\u0180",
+            "",
+            "\1\u0181",
+            "\1\u0182",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0184",
+            "\1\u0185",
+            "\1\u0186",
+            "\1\u0187",
+            "\1\u0189\6\uffff\1\u0188",
+            "\1\u018b\15\uffff\1\u018a",
+            "\1\u018c",
+            "\1\u018d",
+            "\1\u018e",
+            "\1\u018f",
+            "\1\u0190",
+            "\1\u0191",
+            "\1\u0193\2\uffff\1\u0192",
+            "\1\u0194",
+            "\1\u0195",
+            "\1\u0196\12\uffff\1\u0197",
+            "\1\u0198",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u019a",
+            "\1\u019b",
+            "\1\u019c",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\1\103\1\u019f\15\103\1\u019e\2\103\1\u019d\7\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u01a2",
+            "\1\u01a3",
+            "",
+            "\1\u01a4",
+            "\1\u01a5",
+            "\1\103\13\uffff\12\103\7\uffff\1\103\1\u01a9\6\103\1\u01a6"+
+            "\4\103\1\u01a7\4\103\1\u01aa\1\u01ab\1\u01a8\5\103\4\uffff\1"+
+            "\103\1\uffff\32\103",
+            "\1\u01ad",
+            "\1\u01ae",
+            "\1\u01af",
+            "\1\u01b0",
+            "\1\u01b1",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u01b3",
+            "\1\u01b4\2\uffff\1\u01b5",
+            "\1\u01b6",
+            "\1\u01b7",
+            "\1\u01b8",
+            "\1\u01b9",
+            "\1\u01ba",
+            "\1\u01bb",
+            "\1\u01bc",
+            "\1\u01bd",
+            "\1\u01be",
+            "\1\u01bf",
+            "\1\u01c0",
+            "\1\u01c1",
+            "\1\u01c2",
+            "\1\u01c3",
+            "\1\u01c4",
+            "\1\u01c5\3\uffff\1\u01c6",
+            "\1\u01c7",
+            "\1\u01c8",
+            "\1\u01c9",
+            "\1\u01ca",
+            "\1\u01cb",
+            "\1\u01cc",
+            "\1\u01cd",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u01cf",
+            "\1\u01d0",
+            "\1\u01d1",
+            "",
+            "",
+            "\1\u01d2",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u01d5",
+            "\1\u01d6",
+            "\1\u01d7",
+            "",
+            "",
+            "",
+            "",
+            "\1\u01d8",
+            "\1\u01d9",
+            "\1\u01da",
+            "\1\u01db",
+            "\1\u01dc",
+            "\1\u01dd",
+            "\1\u01de",
+            "\1\u01df",
+            "\1\u01e0\1\u01e1\1\uffff\1\u01e3\1\u01e2",
+            "\1\u01e4",
+            "",
+            "\1\u01e5",
+            "\1\u01e7\6\uffff\1\u01e6",
+            "\1\u01e8",
+            "\1\u01e9",
+            "\1\u01ea",
+            "\1\u01eb",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u01ed",
+            "\1\u01ee",
+            "\1\u01ef",
+            "\1\u01f0",
+            "\1\u01f1\3\uffff\1\u01f2",
+            "\1\u01f3",
+            "\1\u01f4",
+            "\1\u01f5",
+            "",
+            "\1\u01f6",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u01f8",
+            "\1\u01f9",
+            "\1\u01fa",
+            "\1\u01fb",
+            "\1\u01fc",
+            "\1\u01fd",
+            "\1\u01fe",
+            "\1\u01ff",
+            "\1\u0200",
+            "\1\103\13\uffff\12\103\7\uffff\17\103\1\u0201\12\103\4\uffff"+
+            "\1\103\1\uffff\14\103\1\u0202\15\103",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0205",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0207",
+            "\1\u0208",
+            "\1\u0209",
+            "",
+            "\1\u020a",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\10\103\1\u020b\21\103",
+            "\1\u020d",
+            "\1\u020e",
+            "\1\u020f",
+            "\1\u0210",
+            "\1\u0211",
+            "\1\u0212",
+            "\1\u0213",
+            "\1\u0214",
+            "",
+            "\1\u0215",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0217",
+            "\1\u0218",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\u0219\1\uffff"+
+            "\32\103",
+            "\1\u021c\1\u021b",
+            "\1\u021d",
+            "\1\u021e",
+            "\1\u021f",
+            "\1\u0223\1\uffff\1\u0221\5\uffff\1\u0222\47\uffff\1\u0220",
+            "\1\u0224",
+            "\1\u0225",
+            "\1\u0226",
+            "\1\u0227",
+            "\1\u0228",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u022a",
+            "\1\u022b",
+            "\1\u022c",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\16\103\1\u0230\13\103",
+            "\1\u0232",
+            "\1\u0233",
+            "\1\u0234",
+            "\1\u0235",
+            "",
+            "",
+            "\1\u0236",
+            "\1\u0237",
+            "\1\u0238",
+            "\1\u0239",
+            "\1\u023a",
+            "\1\u023b",
+            "\1\u023c",
+            "\1\u023d",
+            "\1\u023e",
+            "\1\u023f",
+            "",
+            "\1\u0240",
+            "\1\u0241",
+            "\1\u0242",
+            "\1\u0243",
+            "\1\u0244",
+            "",
+            "\1\u0245",
+            "\1\u0246",
+            "\1\u0247",
+            "\1\u0248",
+            "\1\u0249",
+            "\1\u024a",
+            "\1\u024b",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u024d",
+            "\1\u024e",
+            "\1\u024f",
+            "\1\u0250",
+            "\1\103\13\uffff\12\103\7\uffff\17\103\1\u0251\12\103\4\uffff"+
+            "\1\103\1\uffff\32\103",
+            "\1\u0253",
+            "\1\u0254",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0256",
+            "\1\u0257",
+            "\1\u0258",
+            "\1\u0259",
+            "\1\u025a",
+            "\1\u025b",
+            "\1\u025c",
+            "\1\u025d",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0263",
+            "\1\u0264",
+            "",
+            "",
+            "\1\u0265",
+            "\1\u0266",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0268",
+            "\1\u0269",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u026b",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u026d",
+            "\1\u026e",
+            "\1\u026f",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\u0270\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0273",
+            "\1\u0274\1\u0275\1\u0276\1\u0277\1\u0278",
+            "\1\u0279",
+            "\1\u027a",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u027c",
+            "\1\u027d",
+            "\1\u027e",
+            "\1\u027f",
+            "\1\u0280\1\u0281\12\uffff\1\u0282\3\uffff\1\u0283",
+            "",
+            "\1\u0284",
+            "\1\u0285",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0287",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\14\103\1\u0288\5\103\1\u0289\7\103",
+            "\1\u028b",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u028d",
+            "\1\u028e",
+            "\1\u028f",
+            "",
+            "\1\u0290",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0292",
+            "\1\u0293",
+            "\1\u0294",
+            "\1\u0295",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0297",
+            "\1\u0298",
+            "\1\u0299",
+            "\1\u029a",
+            "",
+            "",
+            "\1\u029b",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\22\103\1\u029c\7\103",
+            "\1\u029e",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02a1",
+            "",
+            "\1\u02a2",
+            "\1\u02a3",
+            "\1\u02a4",
+            "\1\u02a5",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02a7",
+            "\1\u02a8",
+            "\1\u02a9",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\22\103\1\u02aa\7\103",
+            "",
+            "\1\u02ac\16\uffff\1\u02ad",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02af",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\u02b0\1\uffff"+
+            "\32\103",
+            "\1\u02b2",
+            "\1\u02b3",
+            "\1\u02b4",
+            "\1\u02b5",
+            "\1\u02b6",
+            "\1\u02b7",
+            "\1\u02b8",
+            "\1\u02b9",
+            "\1\103\13\uffff\12\103\7\uffff\3\103\1\u02ba\26\103\4\uffff"+
+            "\1\103\1\uffff\32\103",
+            "\1\u02bc",
+            "\1\u02bd",
+            "\1\u02be",
+            "\1\u02bf",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02c1",
+            "\1\u02c2\2\uffff\1\u02c3",
+            "",
+            "",
+            "",
+            "\1\u02c4",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02c6",
+            "\1\u02c7",
+            "\1\u02c8",
+            "\1\u02c9",
+            "\1\u02ca",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\22\103\1\u02cc\7\103",
+            "\1\u02ce",
+            "\1\u02cf",
+            "\1\u02d0",
+            "\1\u02d1",
+            "\1\u02d2\14\uffff\1\u02d3",
+            "\1\u02d4",
+            "\1\u02d5",
+            "\1\103\13\uffff\12\103\7\uffff\21\103\1\u02d6\10\103\4\uffff"+
+            "\1\103\1\uffff\21\103\1\u02d7\10\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02da",
+            "\1\u02db",
+            "\1\u02dc",
+            "\1\u02dd",
+            "\1\u02de",
+            "\1\u02df",
+            "\1\u02e0",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02e2",
+            "",
+            "\1\u02e3",
+            "\1\u02e4",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02e6",
+            "\1\u02e7",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u02e9",
+            "",
+            "\1\u02ea",
+            "\1\u02eb",
+            "\1\u02ec",
+            "\1\u02ed",
+            "\1\u02ee",
+            "\1\u02ef",
+            "\1\u02f0",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u02f2",
+            "\1\u02f3",
+            "\1\u02f4",
+            "\1\u02f5",
+            "",
+            "\1\u02f6",
+            "\1\u02f7",
+            "",
+            "\1\u02f8",
+            "",
+            "\1\u02f9",
+            "\1\u02fa",
+            "\1\u02fb",
+            "\1\u02fc",
+            "",
+            "",
+            "\1\u02fd",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0303",
+            "\1\u0304",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0306",
+            "\1\u0307",
+            "\1\u0308",
+            "\1\u0309\7\uffff\1\u030a",
+            "\1\u030b",
+            "\1\u030c",
+            "\1\u030d",
+            "\1\u030e",
+            "\1\u030f",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0311",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0315",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0318",
+            "\1\u0319\15\uffff\1\u031a",
+            "\1\u031b",
+            "\1\u031c",
+            "",
+            "\1\u031d",
+            "\1\u031e",
+            "\1\u031f",
+            "\1\u0320",
+            "\1\u0321",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0323",
+            "",
+            "",
+            "\1\u0324",
+            "\1\u0325",
+            "\1\u0326",
+            "\1\u0327",
+            "\1\u0328",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u032a",
+            "\1\u032b",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u032d",
+            "\1\u032e",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0330",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0332",
+            "\1\u0333",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0335",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0338",
+            "\1\u0339",
+            "",
+            "\1\u033a",
+            "\1\u033b",
+            "\1\u033c",
+            "\1\u033d",
+            "",
+            "\1\u033e",
+            "\1\u033f",
+            "\1\u0340",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0342",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0344",
+            "\1\u0345",
+            "\1\u0346",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0348",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u034a",
+            "\1\u034b",
+            "\1\u034c",
+            "\1\u034d",
+            "\1\u034e",
+            "\1\u034f",
+            "\1\u0350",
+            "\1\u0351",
+            "",
+            "",
+            "\1\u0352",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0354",
+            "\1\u0355",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0358",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u035a",
+            "\1\u035b",
+            "",
+            "\1\u035c\16\uffff\1\u035d",
+            "\1\u035e",
+            "",
+            "\1\u035f",
+            "\1\u0360",
+            "\1\u0361",
+            "\1\u0362",
+            "\1\u0363",
+            "\1\u0364",
+            "\1\u0365",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0368",
+            "\1\u0369",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u036b",
+            "\1\u036c",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u036f",
+            "\1\u0370",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0373",
+            "\1\u0374",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\1\u0379\1\103\1\u0378\13\103"+
+            "\1\u0377\2\103\1\u037a\10\103\4\uffff\1\103\1\uffff\32\103",
+            "\1\u037c",
+            "\1\u037d",
+            "\1\u037e",
+            "\1\u037f",
+            "\1\u0380",
+            "\1\u0381",
+            "\1\u0382",
+            "",
+            "\1\u0383",
+            "",
+            "",
+            "",
+            "\1\u0384",
+            "",
+            "",
+            "\1\u0385",
+            "\1\u0386",
+            "\1\u0387",
+            "\1\u0388",
+            "\1\u0389",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u038b\21\uffff\1\u038c",
+            "\1\u038d",
+            "\1\u038e",
+            "\1\u038f",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0392\15\uffff\1\u0391",
+            "\1\u0393",
+            "\1\u0394",
+            "\1\u0395",
+            "\1\u0396",
+            "",
+            "\1\u0397",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u039a",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u039c",
+            "\1\u039d",
+            "",
+            "\1\u039e",
+            "",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\u039f\1\uffff"+
+            "\32\103",
+            "\1\u03a1",
+            "\1\u03a2",
+            "\1\u03a3",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u03a5",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\22\103\1\u03a6\7\103",
+            "\1\u03a8",
+            "\1\u03a9",
+            "",
+            "\1\u03aa",
+            "",
+            "\1\u03ab",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u03ad",
+            "",
+            "\1\u03ae",
+            "",
+            "\1\u03af\3\uffff\1\u03b2\10\uffff\1\u03b0\1\uffff\1\u03b1",
+            "\1\u03b3",
+            "\1\u03b4",
+            "\1\u03b5",
+            "\1\u03b6",
+            "\1\u03b7",
+            "\1\u03b8",
+            "\1\u03b9",
+            "\1\u03ba",
+            "",
+            "\1\u03bb",
+            "\1\u03bc",
+            "",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u03be",
+            "\1\u03bf",
+            "\1\u03c0",
+            "\1\u03c1",
+            "\1\u03c2",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u03c4\13\uffff\1\u03c5\1\uffff\1\u03c6\1\u03c7",
+            "\1\u03c8",
+            "\1\u03c9",
+            "\1\u03ca",
+            "\1\u03cb",
+            "\1\u03cc",
+            "",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u03ce",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "",
+            "\1\u03d1",
+            "\1\u03d2",
+            "",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "",
+            "\1\u03d5",
+            "\1\u03d6",
+            "\1\u03d7\21\uffff\1\u03d8",
+            "\1\u03d9",
+            "",
+            "\1\u03da",
+            "\1\u03db",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u03dd",
+            "\1\u03de",
+            "\1\u03df",
+            "\1\u03e0",
+            "\1\u03e1",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\21\103\1\u03e2\10\103",
+            "\1\u03e4",
+            "\1\u03e5",
+            "\1\u03e6",
+            "\1\u03e7",
+            "\1\u03e8",
+            "",
+            "\1\u03e9",
+            "\1\u03ea",
+            "\1\u03eb",
+            "\1\u03ec",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\6\103\1\u03ed\23\103",
+            "",
+            "\1\u03ef",
+            "\1\u03f0",
+            "\1\u03f1",
+            "\1\u03f2",
+            "\1\u03f3",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u03f5",
+            "",
+            "",
+            "\1\u03f6",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u03f8",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u03fa",
+            "",
+            "\1\u03fb",
+            "\1\u03fc",
+            "\1\u03fd",
+            "",
+            "\1\u03fe",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0400",
+            "\1\u0401",
+            "\1\u0402",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0404",
+            "\1\u0405",
+            "\1\u0406",
+            "\1\u0407",
+            "\1\u0408\15\uffff\1\u0409\2\uffff\1\u040a",
+            "\1\u040b",
+            "\1\u040c",
+            "\1\u040d",
+            "\1\u040e",
+            "\1\u040f",
+            "\1\u0410",
+            "\1\u0411",
+            "\1\u0412",
+            "\1\u0413",
+            "\1\u0414",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0416",
+            "\1\u0417",
+            "\1\u0418",
+            "\1\u0419",
+            "\1\u041a",
+            "",
+            "\1\u041b",
+            "\1\u041c",
+            "\1\u041d",
+            "\1\u041e",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0420",
+            "\1\u0421",
+            "\1\u0422",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0424",
+            "",
+            "",
+            "\1\u0425",
+            "\1\u0426",
+            "",
+            "",
+            "\1\u0427",
+            "\1\u0428",
+            "\1\u0429",
+            "\1\u042a",
+            "\1\u042c\13\uffff\1\u042d\2\uffff\1\u042b",
+            "\1\u042e",
+            "\1\u042f",
+            "",
+            "\1\u0430",
+            "\1\u0431",
+            "\1\u0432",
+            "\1\u0433",
+            "\1\u0434",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0436",
+            "\1\u0437",
+            "\1\u0438",
+            "\1\u0439",
+            "\1\u043a",
+            "\1\u043b",
+            "\1\u043c",
+            "\1\u043d",
+            "\1\u043e",
+            "\1\u043f",
+            "",
+            "\1\u0440",
+            "\1\u0441",
+            "\1\u0442",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0444",
+            "",
+            "\1\u0445",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u0447",
+            "",
+            "\1\u0448",
+            "\1\u0449",
+            "\1\u044a",
+            "\1\u044b",
+            "\1\u044c",
+            "",
+            "\1\u044d",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0451",
+            "\1\u0452",
+            "\1\u0453",
+            "\1\u0454",
+            "\1\u0455",
+            "\1\u0456",
+            "\1\u0457",
+            "\1\u0458",
+            "\1\u0459",
+            "\1\u045a",
+            "\1\u045b",
+            "\1\u045c",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u045e",
+            "\1\u045f",
+            "\1\u0460",
+            "",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\u0463",
+            "\1\u0464",
+            "\1\u0465",
+            "\1\u0466",
+            "\1\u0467",
+            "\1\u0468",
+            "\1\u0469",
+            "",
+            "\1\u046a",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "\1\103\13\uffff\12\103\7\uffff\32\103\4\uffff\1\103\1\uffff"+
+            "\32\103",
+            "",
+            "\1\u046d",
+            "\1\u046e",
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSLParser.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSLParser.java
new file mode 100644
index 0000000..d4c23bb
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSLParser.java
@@ -0,0 +1,10014 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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.statemachine.services.StatemachineDSLGrammarAccess;
+
+
+
+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 InternalStatemachineDSLParser extends AbstractInternalAntlrParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_INT", "RULE_STRING", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "'{'", "'}'", "'statemachine'", "'described by'", "'functiongroup'", "'initialState'", "'initialEvent'", "'events'", "'controls'", "'states'", "'event'", "'state'", "'triggers'", "'identity'", "'keystroke'", "'@'", "'and'", "'trigger'", "'guards'", "'actions'", "'transition'", "'blinkRate'", "'clearDevice'", "'createWindow'", "'row'", "'column'", "'height'", "'width'", "'windowHeight'", "'windowWidth'", "'cursorType'", "'destroyWindow'", "'deviceBrightness'", "'displayBitmap'", "'id'", "'displayText'", "'text'", "'type'", "'displayTextAt'", "'interCharacterWait'", "'marqueeFormat'", "'marqueeRepeatWait'", "'marqueeType'", "'marqueeUnitWait'", "'scroll'", "'openDrawer'", "'printBarcode'", "'data'", "'barcodeType'", "'printBitmap'", "'printCut'", "'printNormal'", "'registerBitmap'", "'name'", "'paymentOpen'", "'host'", "'port'", "'paymentClose'", "'paymentAcknowledge'", "'paymentReversal'", "'withPassword'", "'ofReceipt'", "'paymentRegistration'", "'configuration'", "'paymentAuthorization'", "'ofAmount'", "'paymentResponse'", "'from'", "'printReport'", "'operation'", "'('", "')'", "'guard'", "'onFail'", "'caption'", "'description'", "'function'", "'store'", "'with'", "'.'", "'retrieve'", "'translate'", "'dto'", "'+'", "'get'", "','", "'set'", "'clear'", "'remove'", "'visible'", "'invisible'", "'image'", "'search'", "'in'", "'schedule'", "'keypad'", "'fields'", "'dataProvider'", "'scheduler'", "'lineDisplay'", "'posPrinter'", "'cashDrawer'", "'payment'", "'peripheral'", "'button'", "'key'", "'field'", "'layout'", "'delay'", "'send'", "'import'", "'*'", "'-'", "'='", "'#'", "'['", "']'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'**'", "'/'", "'%'", "'!'", "'as'", "'++'", "'--'", "'::'", "'?.'", "'|'", "';'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'var'", "'val'", "'extends'", "'static'", "'extension'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'Boolean'", "'Integer'", "'Long'", "'Double'", "'String'", "'Date'", "'SuggestText'", "'keyboard'", "'getIPAddress'", "'getNow'", "'getUserAgentInfo'", "'isTouchDevice'", "'isHttps'", "'getBrowserLocale'", "'getUserName'", "'getUserPassword'", "'getUserEmail'", "'getUserPosition'", "'getUserPrintService'", "'getSceenWidth'", "'getScreenHeight'", "'getTrigger'", "'humanized'", "'warning'", "'error'", "'tray'", "'assistive'", "'none'", "'fixed'", "'block'", "'halfblock'", "'underline'", "'reverse'", "'other'", "'blink'", "'up'", "'down'", "'left'", "'right'", "'init'", "'walk'", "'place'", "'normal'", "'blinkreverse'", "'upca'", "'upcb'", "'jan8'", "'ean8'", "'jan13'", "'ean13'", "'tf'", "'itf'", "'codeabar'", "'code39'", "'code93'", "'code128'", "'upca_s'", "'upce_s'", "'upcd1'", "'upcd2'", "'upcd3'", "'upcd4'", "'upcd5'", "'ean8_s'", "'ean13_s'", "'ean128'", "'orca'", "'ocrb'", "'code128_parsed'", "'gs1databar'", "'gs1databar_e'", "'gs1databar_s'", "'gs1databar_e_s'", "'pdf417'", "'maxicode'", "'datamatrix'", "'qrcode'", "'uqrcode'", "'aztec'", "'updf417'"
+    };
+    public static final int T__144=144;
+    public static final int T__265=265;
+    public static final int T__143=143;
+    public static final int T__264=264;
+    public static final int T__146=146;
+    public static final int T__267=267;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__266=266;
+    public static final int T__140=140;
+    public static final int T__261=261;
+    public static final int T__260=260;
+    public static final int T__142=142;
+    public static final int T__263=263;
+    public static final int T__141=141;
+    public static final int T__262=262;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__258=258;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__257=257;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__259=259;
+    public static final int T__133=133;
+    public static final int T__254=254;
+    public static final int T__132=132;
+    public static final int T__253=253;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__256=256;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int T__255=255;
+    public static final int T__250=250;
+    public static final int RULE_ID=4;
+    public static final int T__131=131;
+    public static final int T__252=252;
+    public static final int T__130=130;
+    public static final int T__251=251;
+    public static final int RULE_INT=5;
+    public static final int T__66=66;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__247=247;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__246=246;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__249=249;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__248=248;
+    public static final int T__166=166;
+    public static final int T__165=165;
+    public static final int T__168=168;
+    public static final int T__167=167;
+    public static final int T__162=162;
+    public static final int T__161=161;
+    public static final int T__164=164;
+    public static final int T__163=163;
+    public static final int T__160=160;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__159=159;
+    public static final int T__30=30;
+    public static final int T__158=158;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__154=154;
+    public static final int T__157=157;
+    public static final int T__156=156;
+    public static final int T__151=151;
+    public static final int T__150=150;
+    public static final int T__153=153;
+    public static final int T__152=152;
+    public static final int T__270=270;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__269=269;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__268=268;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__100=100;
+    public static final int T__221=221;
+    public static final int T__220=220;
+    public static final int T__102=102;
+    public static final int T__223=223;
+    public static final int T__101=101;
+    public static final int T__222=222;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__218=218;
+    public static final int T__217=217;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__219=219;
+    public static final int T__214=214;
+    public static final int T__213=213;
+    public static final int T__216=216;
+    public static final int T__215=215;
+    public static final int T__210=210;
+    public static final int T__212=212;
+    public static final int T__211=211;
+    public static final int RULE_DECIMAL=8;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__207=207;
+    public static final int T__23=23;
+    public static final int T__206=206;
+    public static final int T__24=24;
+    public static final int T__209=209;
+    public static final int T__25=25;
+    public static final int T__208=208;
+    public static final int T__203=203;
+    public static final int T__202=202;
+    public static final int T__20=20;
+    public static final int T__205=205;
+    public static final int T__21=21;
+    public static final int T__204=204;
+    public static final int T__122=122;
+    public static final int T__243=243;
+    public static final int T__121=121;
+    public static final int T__242=242;
+    public static final int T__124=124;
+    public static final int T__245=245;
+    public static final int T__123=123;
+    public static final int T__244=244;
+    public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__119=119;
+    public static final int T__118=118;
+    public static final int T__239=239;
+    public static final int T__115=115;
+    public static final int T__236=236;
+    public static final int EOF=-1;
+    public static final int T__114=114;
+    public static final int T__235=235;
+    public static final int T__117=117;
+    public static final int T__238=238;
+    public static final int T__116=116;
+    public static final int T__237=237;
+    public static final int T__111=111;
+    public static final int T__232=232;
+    public static final int T__110=110;
+    public static final int T__231=231;
+    public static final int T__113=113;
+    public static final int T__234=234;
+    public static final int T__112=112;
+    public static final int T__233=233;
+    public static final int T__230=230;
+    public static final int T__108=108;
+    public static final int T__229=229;
+    public static final int T__107=107;
+    public static final int T__228=228;
+    public static final int T__109=109;
+    public static final int T__104=104;
+    public static final int T__225=225;
+    public static final int T__103=103;
+    public static final int T__224=224;
+    public static final int T__106=106;
+    public static final int T__227=227;
+    public static final int T__105=105;
+    public static final int T__226=226;
+    public static final int RULE_HEX=7;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__201=201;
+    public static final int T__200=200;
+    public static final int T__91=91;
+    public static final int T__188=188;
+    public static final int T__92=92;
+    public static final int T__187=187;
+    public static final int T__93=93;
+    public static final int T__94=94;
+    public static final int T__189=189;
+    public static final int T__184=184;
+    public static final int T__183=183;
+    public static final int T__186=186;
+    public static final int T__90=90;
+    public static final int T__185=185;
+    public static final int T__180=180;
+    public static final int T__182=182;
+    public static final int T__181=181;
+    public static final int T__99=99;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
+    public static final int T__169=169;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=6;
+    public static final int T__77=77;
+    public static final int T__78=78;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__74=74;
+    public static final int T__75=75;
+    public static final int T__76=76;
+    public static final int T__80=80;
+    public static final int T__199=199;
+    public static final int T__81=81;
+    public static final int T__198=198;
+    public static final int T__82=82;
+    public static final int T__83=83;
+    public static final int T__195=195;
+    public static final int T__194=194;
+    public static final int RULE_WS=11;
+    public static final int T__197=197;
+    public static final int T__196=196;
+    public static final int T__191=191;
+    public static final int T__190=190;
+    public static final int T__193=193;
+    public static final int T__192=192;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__89=89;
+    public static final int T__84=84;
+    public static final int T__85=85;
+    public static final int T__86=86;
+    public static final int T__87=87;
+
+    // delegates
+    // delegators
+
+
+        public InternalStatemachineDSLParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalStatemachineDSLParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+    public String[] getTokenNames() { return InternalStatemachineDSLParser.tokenNames; }
+    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g"; }
+
+
+
+     	private StatemachineDSLGrammarAccess grammarAccess;
+     	
+        public InternalStatemachineDSLParser(TokenStream input, StatemachineDSLGrammarAccess grammarAccess) {
+            this(input);
+            this.grammarAccess = grammarAccess;
+            registerRules(grammarAccess.getGrammar());
+        }
+        
+        @Override
+        protected String getFirstRuleName() {
+        	return "StatemachineModel";	
+       	}
+       	
+       	@Override
+       	protected StatemachineDSLGrammarAccess getGrammarAccess() {
+       		return grammarAccess;
+       	}
+
+
+
+    // $ANTLR start "entryRuleStatemachineModel"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:68:1: entryRuleStatemachineModel returns [EObject current=null] : iv_ruleStatemachineModel= ruleStatemachineModel EOF ;
+    public final EObject entryRuleStatemachineModel() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineModel = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:69:2: (iv_ruleStatemachineModel= ruleStatemachineModel EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:70:2: iv_ruleStatemachineModel= ruleStatemachineModel EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineModelRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineModel_in_entryRuleStatemachineModel75);
+            iv_ruleStatemachineModel=ruleStatemachineModel();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineModel; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineModel85); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineModel"
+
+
+    // $ANTLR start "ruleStatemachineModel"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:77:1: ruleStatemachineModel returns [EObject current=null] : ( (lv_packages_0_0= ruleStatemachinePackage ) )* ;
+    public final EObject ruleStatemachineModel() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_packages_0_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:80:28: ( ( (lv_packages_0_0= ruleStatemachinePackage ) )* )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:81:1: ( (lv_packages_0_0= ruleStatemachinePackage ) )*
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:81:1: ( (lv_packages_0_0= ruleStatemachinePackage ) )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0==13) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:82:1: (lv_packages_0_0= ruleStatemachinePackage )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:82:1: (lv_packages_0_0= ruleStatemachinePackage )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:83:3: lv_packages_0_0= ruleStatemachinePackage
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getStatemachineModelAccess().getPackagesStatemachinePackageParserRuleCall_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStatemachinePackage_in_ruleStatemachineModel130);
+            	    lv_packages_0_0=ruleStatemachinePackage();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getStatemachineModelRule());
+            	      	        }
+            	             		add(
+            	             			current, 
+            	             			"packages",
+            	              		lv_packages_0_0, 
+            	              		"StatemachinePackage");
+            	      	        afterParserOrEnumRuleCall();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineModel"
+
+
+    // $ANTLR start "entryRuleStatemachinePackage"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:107:1: entryRuleStatemachinePackage returns [EObject current=null] : iv_ruleStatemachinePackage= ruleStatemachinePackage EOF ;
+    public final EObject entryRuleStatemachinePackage() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachinePackage = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:108:2: (iv_ruleStatemachinePackage= ruleStatemachinePackage EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:109:2: iv_ruleStatemachinePackage= ruleStatemachinePackage EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachinePackageRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachinePackage_in_entryRuleStatemachinePackage166);
+            iv_ruleStatemachinePackage=ruleStatemachinePackage();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachinePackage; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachinePackage176); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachinePackage"
+
+
+    // $ANTLR start "ruleStatemachinePackage"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:116:1: ruleStatemachinePackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleStatemachineImport ) )* ( (lv_statemachines_5_0= ruleStatemachine ) )* otherlv_6= '}' )? ) ;
+    public final EObject ruleStatemachinePackage() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_6=null;
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        EObject lv_imports_4_0 = null;
+
+        EObject lv_statemachines_5_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:119:28: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleStatemachineImport ) )* ( (lv_statemachines_5_0= ruleStatemachine ) )* otherlv_6= '}' )? ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:120:1: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleStatemachineImport ) )* ( (lv_statemachines_5_0= ruleStatemachine ) )* otherlv_6= '}' )? )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:120:1: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleStatemachineImport ) )* ( (lv_statemachines_5_0= ruleStatemachine ) )* otherlv_6= '}' )? )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:120:2: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleStatemachineImport ) )* ( (lv_statemachines_5_0= ruleStatemachine ) )* otherlv_6= '}' )?
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:120:2: ()
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:121:5: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getStatemachinePackageAccess().getStatemachinePackageAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,13,FOLLOW_13_in_ruleStatemachinePackage222); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachinePackageAccess().getPackageKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:130:1: ( (lv_name_2_0= ruleQualifiedName ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:131:1: (lv_name_2_0= ruleQualifiedName )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:131:1: (lv_name_2_0= ruleQualifiedName )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:132:3: lv_name_2_0= ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachinePackageAccess().getNameQualifiedNameParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleQualifiedName_in_ruleStatemachinePackage243);
+            lv_name_2_0=ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachinePackageRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"name",
+                      		lv_name_2_0, 
+                      		"QualifiedName");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:148:2: (otherlv_3= '{' ( (lv_imports_4_0= ruleStatemachineImport ) )* ( (lv_statemachines_5_0= ruleStatemachine ) )* otherlv_6= '}' )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0==14) ) {
+                alt4=1;
+            }
+            switch (alt4) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:148:4: otherlv_3= '{' ( (lv_imports_4_0= ruleStatemachineImport ) )* ( (lv_statemachines_5_0= ruleStatemachine ) )* otherlv_6= '}'
+                    {
+                    otherlv_3=(Token)match(input,14,FOLLOW_14_in_ruleStatemachinePackage256); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_3, grammarAccess.getStatemachinePackageAccess().getLeftCurlyBracketKeyword_3_0());
+                          
+                    }
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:152:1: ( (lv_imports_4_0= ruleStatemachineImport ) )*
+                    loop2:
+                    do {
+                        int alt2=2;
+                        int LA2_0 = input.LA(1);
+
+                        if ( (LA2_0==124) ) {
+                            alt2=1;
+                        }
+
+
+                        switch (alt2) {
+                    	case 1 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:153:1: (lv_imports_4_0= ruleStatemachineImport )
+                    	    {
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:153:1: (lv_imports_4_0= ruleStatemachineImport )
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:154:3: lv_imports_4_0= ruleStatemachineImport
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	      	        newCompositeNode(grammarAccess.getStatemachinePackageAccess().getImportsStatemachineImportParserRuleCall_3_1_0()); 
+                    	      	    
+                    	    }
+                    	    pushFollow(FOLLOW_ruleStatemachineImport_in_ruleStatemachinePackage277);
+                    	    lv_imports_4_0=ruleStatemachineImport();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      	        if (current==null) {
+                    	      	            current = createModelElementForParent(grammarAccess.getStatemachinePackageRule());
+                    	      	        }
+                    	             		add(
+                    	             			current, 
+                    	             			"imports",
+                    	              		lv_imports_4_0, 
+                    	              		"StatemachineImport");
+                    	      	        afterParserOrEnumRuleCall();
+                    	      	    
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop2;
+                        }
+                    } while (true);
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:170:3: ( (lv_statemachines_5_0= ruleStatemachine ) )*
+                    loop3:
+                    do {
+                        int alt3=2;
+                        int LA3_0 = input.LA(1);
+
+                        if ( (LA3_0==16) ) {
+                            alt3=1;
+                        }
+
+
+                        switch (alt3) {
+                    	case 1 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:171:1: (lv_statemachines_5_0= ruleStatemachine )
+                    	    {
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:171:1: (lv_statemachines_5_0= ruleStatemachine )
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:172:3: lv_statemachines_5_0= ruleStatemachine
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	      	        newCompositeNode(grammarAccess.getStatemachinePackageAccess().getStatemachinesStatemachineParserRuleCall_3_2_0()); 
+                    	      	    
+                    	    }
+                    	    pushFollow(FOLLOW_ruleStatemachine_in_ruleStatemachinePackage299);
+                    	    lv_statemachines_5_0=ruleStatemachine();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      	        if (current==null) {
+                    	      	            current = createModelElementForParent(grammarAccess.getStatemachinePackageRule());
+                    	      	        }
+                    	             		add(
+                    	             			current, 
+                    	             			"statemachines",
+                    	              		lv_statemachines_5_0, 
+                    	              		"Statemachine");
+                    	      	        afterParserOrEnumRuleCall();
+                    	      	    
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop3;
+                        }
+                    } while (true);
+
+                    otherlv_6=(Token)match(input,15,FOLLOW_15_in_ruleStatemachinePackage312); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_6, grammarAccess.getStatemachinePackageAccess().getRightCurlyBracketKeyword_3_3());
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachinePackage"
+
+
+    // $ANTLR start "entryRuleStatemachine"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:200:1: entryRuleStatemachine returns [EObject current=null] : iv_ruleStatemachine= ruleStatemachine EOF ;
+    public final EObject entryRuleStatemachine() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachine = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:201:2: (iv_ruleStatemachine= ruleStatemachine EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:202:2: iv_ruleStatemachine= ruleStatemachine EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachine_in_entryRuleStatemachine350);
+            iv_ruleStatemachine=ruleStatemachine();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachine; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachine360); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachine"
+
+
+    // $ANTLR start "ruleStatemachine"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:209:1: ruleStatemachine returns [EObject current=null] : (otherlv_0= 'statemachine' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'described by' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'functiongroup' ( (otherlv_5= RULE_ID ) ) )? otherlv_6= 'initialState' ( (otherlv_7= RULE_ID ) ) otherlv_8= 'initialEvent' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'events' (otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}' ) ) (otherlv_14= 'controls' otherlv_15= '{' ( (lv_controls_16_0= ruleStatemachineControl ) )* otherlv_17= '}' ) (otherlv_18= 'states' otherlv_19= '{' ( (lv_states_20_0= ruleStatemachineState ) )* otherlv_21= '}' ) ) ;
+    public final EObject ruleStatemachine() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        Token lv_description_2_0=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_15=null;
+        Token otherlv_17=null;
+        Token otherlv_18=null;
+        Token otherlv_19=null;
+        Token otherlv_21=null;
+        AntlrDatatypeRuleToken lv_descriptionValue_3_0 = null;
+
+        EObject lv_events_12_0 = null;
+
+        EObject lv_controls_16_0 = null;
+
+        EObject lv_states_20_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:212:28: ( (otherlv_0= 'statemachine' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'described by' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'functiongroup' ( (otherlv_5= RULE_ID ) ) )? otherlv_6= 'initialState' ( (otherlv_7= RULE_ID ) ) otherlv_8= 'initialEvent' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'events' (otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}' ) ) (otherlv_14= 'controls' otherlv_15= '{' ( (lv_controls_16_0= ruleStatemachineControl ) )* otherlv_17= '}' ) (otherlv_18= 'states' otherlv_19= '{' ( (lv_states_20_0= ruleStatemachineState ) )* otherlv_21= '}' ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:213:1: (otherlv_0= 'statemachine' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'described by' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'functiongroup' ( (otherlv_5= RULE_ID ) ) )? otherlv_6= 'initialState' ( (otherlv_7= RULE_ID ) ) otherlv_8= 'initialEvent' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'events' (otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}' ) ) (otherlv_14= 'controls' otherlv_15= '{' ( (lv_controls_16_0= ruleStatemachineControl ) )* otherlv_17= '}' ) (otherlv_18= 'states' otherlv_19= '{' ( (lv_states_20_0= ruleStatemachineState ) )* otherlv_21= '}' ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:213:1: (otherlv_0= 'statemachine' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'described by' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'functiongroup' ( (otherlv_5= RULE_ID ) ) )? otherlv_6= 'initialState' ( (otherlv_7= RULE_ID ) ) otherlv_8= 'initialEvent' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'events' (otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}' ) ) (otherlv_14= 'controls' otherlv_15= '{' ( (lv_controls_16_0= ruleStatemachineControl ) )* otherlv_17= '}' ) (otherlv_18= 'states' otherlv_19= '{' ( (lv_states_20_0= ruleStatemachineState ) )* otherlv_21= '}' ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:213:3: otherlv_0= 'statemachine' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'described by' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'functiongroup' ( (otherlv_5= RULE_ID ) ) )? otherlv_6= 'initialState' ( (otherlv_7= RULE_ID ) ) otherlv_8= 'initialEvent' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'events' (otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}' ) ) (otherlv_14= 'controls' otherlv_15= '{' ( (lv_controls_16_0= ruleStatemachineControl ) )* otherlv_17= '}' ) (otherlv_18= 'states' otherlv_19= '{' ( (lv_states_20_0= ruleStatemachineState ) )* otherlv_21= '}' )
+            {
+            otherlv_0=(Token)match(input,16,FOLLOW_16_in_ruleStatemachine397); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineAccess().getStatemachineKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:217:1: ( (lv_name_1_0= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:218:1: (lv_name_1_0= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:218:1: (lv_name_1_0= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:219:3: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachine414); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineAccess().getNameIDTerminalRuleCall_1_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"name",
+                      		lv_name_1_0, 
+                      		"ID");
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:235:2: ( ( (lv_description_2_0= 'described by' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )?
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==17) ) {
+                alt5=1;
+            }
+            switch (alt5) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:235:3: ( (lv_description_2_0= 'described by' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:235:3: ( (lv_description_2_0= 'described by' ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:236:1: (lv_description_2_0= 'described by' )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:236:1: (lv_description_2_0= 'described by' )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:237:3: lv_description_2_0= 'described by'
+                    {
+                    lv_description_2_0=(Token)match(input,17,FOLLOW_17_in_ruleStatemachine438); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              newLeafNode(lv_description_2_0, grammarAccess.getStatemachineAccess().getDescriptionDescribedByKeyword_2_0_0());
+                          
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineRule());
+                      	        }
+                             		setWithLastConsumed(current, "description", true, "described by");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:250:2: ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:251:1: (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:251:1: (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:252:3: lv_descriptionValue_3_0= ruleTRANSLATABLESTRING
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getStatemachineAccess().getDescriptionValueTRANSLATABLESTRINGParserRuleCall_2_1_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleTRANSLATABLESTRING_in_ruleStatemachine472);
+                    lv_descriptionValue_3_0=ruleTRANSLATABLESTRING();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                      	        }
+                             		set(
+                             			current, 
+                             			"descriptionValue",
+                              		lv_descriptionValue_3_0, 
+                              		"TRANSLATABLESTRING");
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:268:4: (otherlv_4= 'functiongroup' ( (otherlv_5= RULE_ID ) ) )?
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==18) ) {
+                alt6=1;
+            }
+            switch (alt6) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:268:6: otherlv_4= 'functiongroup' ( (otherlv_5= RULE_ID ) )
+                    {
+                    otherlv_4=(Token)match(input,18,FOLLOW_18_in_ruleStatemachine487); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_4, grammarAccess.getStatemachineAccess().getFunctiongroupKeyword_3_0());
+                          
+                    }
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:272:1: ( (otherlv_5= RULE_ID ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:273:1: (otherlv_5= RULE_ID )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:273:1: (otherlv_5= RULE_ID )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:274:3: otherlv_5= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineRule());
+                      	        }
+                              
+                    }
+                    otherlv_5=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachine507); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      		newLeafNode(otherlv_5, grammarAccess.getStatemachineAccess().getFunctionGroupFunctionLibraryStatemachineGroupCrossReference_3_1_0()); 
+                      	
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,19,FOLLOW_19_in_ruleStatemachine521); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_6, grammarAccess.getStatemachineAccess().getInitialStateKeyword_4());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:289:1: ( (otherlv_7= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:290:1: (otherlv_7= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:290:1: (otherlv_7= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:291:3: otherlv_7= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineRule());
+              	        }
+                      
+            }
+            otherlv_7=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachine541); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_7, grammarAccess.getStatemachineAccess().getInitialStateStatemachineStateCrossReference_5_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+            otherlv_8=(Token)match(input,20,FOLLOW_20_in_ruleStatemachine553); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_8, grammarAccess.getStatemachineAccess().getInitialEventKeyword_6());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:306:1: ( (otherlv_9= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:307:1: (otherlv_9= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:307:1: (otherlv_9= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:308:3: otherlv_9= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineRule());
+              	        }
+                      
+            }
+            otherlv_9=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachine573); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_9, grammarAccess.getStatemachineAccess().getInitialEventStatemachineEventCrossReference_7_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:319:2: (otherlv_10= 'events' (otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}' ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:319:4: otherlv_10= 'events' (otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}' )
+            {
+            otherlv_10=(Token)match(input,21,FOLLOW_21_in_ruleStatemachine586); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_10, grammarAccess.getStatemachineAccess().getEventsKeyword_8_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:323:1: (otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:323:3: otherlv_11= '{' ( (lv_events_12_0= ruleStatemachineEvent ) )* otherlv_13= '}'
+            {
+            otherlv_11=(Token)match(input,14,FOLLOW_14_in_ruleStatemachine599); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_11, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:327:1: ( (lv_events_12_0= ruleStatemachineEvent ) )*
+            loop7:
+            do {
+                int alt7=2;
+                int LA7_0 = input.LA(1);
+
+                if ( (LA7_0==24) ) {
+                    alt7=1;
+                }
+
+
+                switch (alt7) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:328:1: (lv_events_12_0= ruleStatemachineEvent )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:328:1: (lv_events_12_0= ruleStatemachineEvent )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:329:3: lv_events_12_0= ruleStatemachineEvent
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getStatemachineAccess().getEventsStatemachineEventParserRuleCall_8_1_1_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStatemachineEvent_in_ruleStatemachine620);
+            	    lv_events_12_0=ruleStatemachineEvent();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	      	        }
+            	             		add(
+            	             			current, 
+            	             			"events",
+            	              		lv_events_12_0, 
+            	              		"StatemachineEvent");
+            	      	        afterParserOrEnumRuleCall();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop7;
+                }
+            } while (true);
+
+            otherlv_13=(Token)match(input,15,FOLLOW_15_in_ruleStatemachine633); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_13, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_2());
+                  
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:349:3: (otherlv_14= 'controls' otherlv_15= '{' ( (lv_controls_16_0= ruleStatemachineControl ) )* otherlv_17= '}' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:349:5: otherlv_14= 'controls' otherlv_15= '{' ( (lv_controls_16_0= ruleStatemachineControl ) )* otherlv_17= '}'
+            {
+            otherlv_14=(Token)match(input,22,FOLLOW_22_in_ruleStatemachine648); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_14, grammarAccess.getStatemachineAccess().getControlsKeyword_9_0());
+                  
+            }
+            otherlv_15=(Token)match(input,14,FOLLOW_14_in_ruleStatemachine660); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_15, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_9_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:357:1: ( (lv_controls_16_0= ruleStatemachineControl ) )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( ((LA8_0>=109 && LA8_0<=112)||LA8_0==117) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:358:1: (lv_controls_16_0= ruleStatemachineControl )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:358:1: (lv_controls_16_0= ruleStatemachineControl )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:359:3: lv_controls_16_0= ruleStatemachineControl
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getStatemachineAccess().getControlsStatemachineControlParserRuleCall_9_2_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStatemachineControl_in_ruleStatemachine681);
+            	    lv_controls_16_0=ruleStatemachineControl();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	      	        }
+            	             		add(
+            	             			current, 
+            	             			"controls",
+            	              		lv_controls_16_0, 
+            	              		"StatemachineControl");
+            	      	        afterParserOrEnumRuleCall();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            otherlv_17=(Token)match(input,15,FOLLOW_15_in_ruleStatemachine694); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_17, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_9_3());
+                  
+            }
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:379:2: (otherlv_18= 'states' otherlv_19= '{' ( (lv_states_20_0= ruleStatemachineState ) )* otherlv_21= '}' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:379:4: otherlv_18= 'states' otherlv_19= '{' ( (lv_states_20_0= ruleStatemachineState ) )* otherlv_21= '}'
+            {
+            otherlv_18=(Token)match(input,23,FOLLOW_23_in_ruleStatemachine708); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_18, grammarAccess.getStatemachineAccess().getStatesKeyword_10_0());
+                  
+            }
+            otherlv_19=(Token)match(input,14,FOLLOW_14_in_ruleStatemachine720); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_19, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_10_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:387:1: ( (lv_states_20_0= ruleStatemachineState ) )*
+            loop9:
+            do {
+                int alt9=2;
+                int LA9_0 = input.LA(1);
+
+                if ( (LA9_0==25) ) {
+                    alt9=1;
+                }
+
+
+                switch (alt9) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:388:1: (lv_states_20_0= ruleStatemachineState )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:388:1: (lv_states_20_0= ruleStatemachineState )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:389:3: lv_states_20_0= ruleStatemachineState
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getStatemachineAccess().getStatesStatemachineStateParserRuleCall_10_2_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStatemachineState_in_ruleStatemachine741);
+            	    lv_states_20_0=ruleStatemachineState();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	      	        }
+            	             		add(
+            	             			current, 
+            	             			"states",
+            	              		lv_states_20_0, 
+            	              		"StatemachineState");
+            	      	        afterParserOrEnumRuleCall();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop9;
+                }
+            } while (true);
+
+            otherlv_21=(Token)match(input,15,FOLLOW_15_in_ruleStatemachine754); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_21, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_10_3());
+                  
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachine"
+
+
+    // $ANTLR start "entryRuleStatemachineEvent"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:417:1: entryRuleStatemachineEvent returns [EObject current=null] : iv_ruleStatemachineEvent= ruleStatemachineEvent EOF ;
+    public final EObject entryRuleStatemachineEvent() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineEvent = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:418:2: (iv_ruleStatemachineEvent= ruleStatemachineEvent EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:419:2: iv_ruleStatemachineEvent= ruleStatemachineEvent EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineEventRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineEvent_in_entryRuleStatemachineEvent791);
+            iv_ruleStatemachineEvent=ruleStatemachineEvent();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineEvent; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineEvent801); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineEvent"
+
+
+    // $ANTLR start "ruleStatemachineEvent"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:426:1: ruleStatemachineEvent returns [EObject current=null] : (otherlv_0= 'event' ( (lv_name_1_0= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineEvent() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:429:28: ( (otherlv_0= 'event' ( (lv_name_1_0= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:430:1: (otherlv_0= 'event' ( (lv_name_1_0= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:430:1: (otherlv_0= 'event' ( (lv_name_1_0= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:430:3: otherlv_0= 'event' ( (lv_name_1_0= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,24,FOLLOW_24_in_ruleStatemachineEvent838); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineEventAccess().getEventKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:434:1: ( (lv_name_1_0= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:435:1: (lv_name_1_0= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:435:1: (lv_name_1_0= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:436:3: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineEvent855); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineEventAccess().getNameIDTerminalRuleCall_1_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineEventRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"name",
+                      		lv_name_1_0, 
+                      		"ID");
+              	    
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineEvent"
+
+
+    // $ANTLR start "entryRuleStatemachineState"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:460:1: entryRuleStatemachineState returns [EObject current=null] : iv_ruleStatemachineState= ruleStatemachineState EOF ;
+    public final EObject entryRuleStatemachineState() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineState = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:461:2: (iv_ruleStatemachineState= ruleStatemachineState EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:462:2: iv_ruleStatemachineState= ruleStatemachineState EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineStateRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineState_in_entryRuleStatemachineState896);
+            iv_ruleStatemachineState=ruleStatemachineState();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineState; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineState906); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineState"
+
+
+    // $ANTLR start "ruleStatemachineState"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:469:1: ruleStatemachineState returns [EObject current=null] : (otherlv_0= 'state' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* ) ) ) otherlv_15= '}' ) ;
+    public final EObject ruleStatemachineState() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        Token otherlv_12=null;
+        Token lv_hasKeyOperation_13_0=null;
+        Token otherlv_15=null;
+        EObject lv_triggers_6_0 = null;
+
+        EObject lv_identity_9_0 = null;
+
+        EObject lv_keyOperation_14_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:472:28: ( (otherlv_0= 'state' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* ) ) ) otherlv_15= '}' ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:473:1: (otherlv_0= 'state' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* ) ) ) otherlv_15= '}' )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:473:1: (otherlv_0= 'state' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* ) ) ) otherlv_15= '}' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:473:3: otherlv_0= 'state' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* ) ) ) otherlv_15= '}'
+            {
+            otherlv_0=(Token)match(input,25,FOLLOW_25_in_ruleStatemachineState943); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineStateAccess().getStateKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:477:1: ( (lv_name_1_0= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:478:1: (lv_name_1_0= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:478:1: (lv_name_1_0= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:479:3: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineState960); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_name_1_0, grammarAccess.getStatemachineStateAccess().getNameIDTerminalRuleCall_1_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineStateRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"name",
+                      		lv_name_1_0, 
+                      		"ID");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleStatemachineState977); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:499:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:501:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:501:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:502:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:505:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )* )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:506:3: ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )*
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:506:3: ( ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) ) )*
+            loop12:
+            do {
+                int alt12=4;
+                int LA12_0 = input.LA(1);
+
+                if ( LA12_0 ==26 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 0) ) {
+                    alt12=1;
+                }
+                else if ( LA12_0 ==27 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 1) ) {
+                    alt12=2;
+                }
+                else if ( LA12_0 ==28 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 2) ) {
+                    alt12=3;
+                }
+
+
+                switch (alt12) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:508:4: ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:508:4: ({...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:509:5: {...}? => ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachineState", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 0)");
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:509:114: ( ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:510:6: ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 0);
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:513:6: ({...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:513:7: {...}? => (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachineState", "true");
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:513:16: (otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}' )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:513:18: otherlv_4= 'triggers' otherlv_5= '{' ( (lv_triggers_6_0= ruleStatemachineTrigger ) )* otherlv_7= '}'
+            	    {
+            	    otherlv_4=(Token)match(input,26,FOLLOW_26_in_ruleStatemachineState1035); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	          	newLeafNode(otherlv_4, grammarAccess.getStatemachineStateAccess().getTriggersKeyword_3_0_0());
+            	          
+            	    }
+            	    otherlv_5=(Token)match(input,14,FOLLOW_14_in_ruleStatemachineState1047); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	          	newLeafNode(otherlv_5, grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_3_0_1());
+            	          
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:521:1: ( (lv_triggers_6_0= ruleStatemachineTrigger ) )*
+            	    loop10:
+            	    do {
+            	        int alt10=2;
+            	        int LA10_0 = input.LA(1);
+
+            	        if ( (LA10_0==31) ) {
+            	            alt10=1;
+            	        }
+
+
+            	        switch (alt10) {
+            	    	case 1 :
+            	    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:522:1: (lv_triggers_6_0= ruleStatemachineTrigger )
+            	    	    {
+            	    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:522:1: (lv_triggers_6_0= ruleStatemachineTrigger )
+            	    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:523:3: lv_triggers_6_0= ruleStatemachineTrigger
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+            	    	       
+            	    	      	        newCompositeNode(grammarAccess.getStatemachineStateAccess().getTriggersStatemachineTriggerParserRuleCall_3_0_2_0()); 
+            	    	      	    
+            	    	    }
+            	    	    pushFollow(FOLLOW_ruleStatemachineTrigger_in_ruleStatemachineState1068);
+            	    	    lv_triggers_6_0=ruleStatemachineTrigger();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      	        if (current==null) {
+            	    	      	            current = createModelElementForParent(grammarAccess.getStatemachineStateRule());
+            	    	      	        }
+            	    	             		add(
+            	    	             			current, 
+            	    	             			"triggers",
+            	    	              		lv_triggers_6_0, 
+            	    	              		"StatemachineTrigger");
+            	    	      	        afterParserOrEnumRuleCall();
+            	    	      	    
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop10;
+            	        }
+            	    } while (true);
+
+            	    otherlv_7=(Token)match(input,15,FOLLOW_15_in_ruleStatemachineState1081); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	          	newLeafNode(otherlv_7, grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_3_0_3());
+            	          
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:550:4: ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:550:4: ({...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:551:5: {...}? => ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachineState", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 1)");
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:551:114: ( ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:552:6: ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 1);
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:555:6: ({...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:555:7: {...}? => (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachineState", "true");
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:555:16: (otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:555:18: otherlv_8= 'identity' ( (lv_identity_9_0= ruleStatemachineOperation ) )
+            	    {
+            	    otherlv_8=(Token)match(input,27,FOLLOW_27_in_ruleStatemachineState1149); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	          	newLeafNode(otherlv_8, grammarAccess.getStatemachineStateAccess().getIdentityKeyword_3_1_0());
+            	          
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:559:1: ( (lv_identity_9_0= ruleStatemachineOperation ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:560:1: (lv_identity_9_0= ruleStatemachineOperation )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:560:1: (lv_identity_9_0= ruleStatemachineOperation )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:561:3: lv_identity_9_0= ruleStatemachineOperation
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getStatemachineStateAccess().getIdentityStatemachineOperationParserRuleCall_3_1_1_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStatemachineOperation_in_ruleStatemachineState1170);
+            	    lv_identity_9_0=ruleStatemachineOperation();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getStatemachineStateRule());
+            	      	        }
+            	             		set(
+            	             			current, 
+            	             			"identity",
+            	              		lv_identity_9_0, 
+            	              		"StatemachineOperation");
+            	      	        afterParserOrEnumRuleCall();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:584:4: ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:584:4: ({...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:585:5: {...}? => ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 2) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachineState", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 2)");
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:585:114: ( ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:586:6: ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3(), 2);
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:589:6: ({...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:589:7: {...}? => (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachineState", "true");
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:589:16: (otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )? )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:589:18: otherlv_10= 'keystroke' otherlv_11= '@' ( (otherlv_12= RULE_ID ) ) ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )?
+            	    {
+            	    otherlv_10=(Token)match(input,28,FOLLOW_28_in_ruleStatemachineState1238); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	          	newLeafNode(otherlv_10, grammarAccess.getStatemachineStateAccess().getKeystrokeKeyword_3_2_0());
+            	          
+            	    }
+            	    otherlv_11=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineState1250); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	          	newLeafNode(otherlv_11, grammarAccess.getStatemachineStateAccess().getCommercialAtKeyword_3_2_1());
+            	          
+            	    }
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:597:1: ( (otherlv_12= RULE_ID ) )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:598:1: (otherlv_12= RULE_ID )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:598:1: (otherlv_12= RULE_ID )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:599:3: otherlv_12= RULE_ID
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      			if (current==null) {
+            	      	            current = createModelElement(grammarAccess.getStatemachineStateRule());
+            	      	        }
+            	              
+            	    }
+            	    otherlv_12=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineState1270); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      		newLeafNode(otherlv_12, grammarAccess.getStatemachineStateAccess().getKeystrokeStatemachineControlFieldAttributeCrossReference_3_2_2_0()); 
+            	      	
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:610:2: ( ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) ) )?
+            	    int alt11=2;
+            	    int LA11_0 = input.LA(1);
+
+            	    if ( (LA11_0==30) ) {
+            	        alt11=1;
+            	    }
+            	    switch (alt11) {
+            	        case 1 :
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:610:3: ( (lv_hasKeyOperation_13_0= 'and' ) ) ( (lv_keyOperation_14_0= ruleStatemachineOperation ) )
+            	            {
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:610:3: ( (lv_hasKeyOperation_13_0= 'and' ) )
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:611:1: (lv_hasKeyOperation_13_0= 'and' )
+            	            {
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:611:1: (lv_hasKeyOperation_13_0= 'and' )
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:612:3: lv_hasKeyOperation_13_0= 'and'
+            	            {
+            	            lv_hasKeyOperation_13_0=(Token)match(input,30,FOLLOW_30_in_ruleStatemachineState1289); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	                      newLeafNode(lv_hasKeyOperation_13_0, grammarAccess.getStatemachineStateAccess().getHasKeyOperationAndKeyword_3_2_3_0_0());
+            	                  
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              	        if (current==null) {
+            	              	            current = createModelElement(grammarAccess.getStatemachineStateRule());
+            	              	        }
+            	                     		setWithLastConsumed(current, "hasKeyOperation", true, "and");
+            	              	    
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:625:2: ( (lv_keyOperation_14_0= ruleStatemachineOperation ) )
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:626:1: (lv_keyOperation_14_0= ruleStatemachineOperation )
+            	            {
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:626:1: (lv_keyOperation_14_0= ruleStatemachineOperation )
+            	            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:627:3: lv_keyOperation_14_0= ruleStatemachineOperation
+            	            {
+            	            if ( state.backtracking==0 ) {
+            	               
+            	              	        newCompositeNode(grammarAccess.getStatemachineStateAccess().getKeyOperationStatemachineOperationParserRuleCall_3_2_3_1_0()); 
+            	              	    
+            	            }
+            	            pushFollow(FOLLOW_ruleStatemachineOperation_in_ruleStatemachineState1323);
+            	            lv_keyOperation_14_0=ruleStatemachineOperation();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              	        if (current==null) {
+            	              	            current = createModelElementForParent(grammarAccess.getStatemachineStateRule());
+            	              	        }
+            	                     		set(
+            	                     			current, 
+            	                     			"keyOperation",
+            	                      		lv_keyOperation_14_0, 
+            	                      		"StatemachineOperation");
+            	              	        afterParserOrEnumRuleCall();
+            	              	    
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop12;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3());
+
+            }
+
+            otherlv_15=(Token)match(input,15,FOLLOW_15_in_ruleStatemachineState1378); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_15, grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_4());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineState"
+
+
+    // $ANTLR start "entryRuleStatemachineTrigger"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:669:1: entryRuleStatemachineTrigger returns [EObject current=null] : iv_ruleStatemachineTrigger= ruleStatemachineTrigger EOF ;
+    public final EObject entryRuleStatemachineTrigger() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineTrigger = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:670:2: (iv_ruleStatemachineTrigger= ruleStatemachineTrigger EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:671:2: iv_ruleStatemachineTrigger= ruleStatemachineTrigger EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineTriggerRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineTrigger_in_entryRuleStatemachineTrigger1414);
+            iv_ruleStatemachineTrigger=ruleStatemachineTrigger();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineTrigger; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineTrigger1424); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineTrigger"
+
+
+    // $ANTLR start "ruleStatemachineTrigger"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:678:1: ruleStatemachineTrigger returns [EObject current=null] : ( () otherlv_1= 'trigger' ( (otherlv_2= RULE_ID ) )* (otherlv_3= 'guards' otherlv_4= '{' ( (lv_guards_5_0= ruleStatemachineGuard ) )* otherlv_6= '}' )? otherlv_7= 'actions' ( ( (lv_hasTransition_8_0= 'transition' ) ) ( (otherlv_9= RULE_ID ) ) )? otherlv_10= '{' ( (lv_actions_11_0= ruleStatemachineAction ) )* otherlv_12= '}' ) ;
+    public final EObject ruleStatemachineTrigger() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token lv_hasTransition_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        EObject lv_guards_5_0 = null;
+
+        EObject lv_actions_11_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:681:28: ( ( () otherlv_1= 'trigger' ( (otherlv_2= RULE_ID ) )* (otherlv_3= 'guards' otherlv_4= '{' ( (lv_guards_5_0= ruleStatemachineGuard ) )* otherlv_6= '}' )? otherlv_7= 'actions' ( ( (lv_hasTransition_8_0= 'transition' ) ) ( (otherlv_9= RULE_ID ) ) )? otherlv_10= '{' ( (lv_actions_11_0= ruleStatemachineAction ) )* otherlv_12= '}' ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:682:1: ( () otherlv_1= 'trigger' ( (otherlv_2= RULE_ID ) )* (otherlv_3= 'guards' otherlv_4= '{' ( (lv_guards_5_0= ruleStatemachineGuard ) )* otherlv_6= '}' )? otherlv_7= 'actions' ( ( (lv_hasTransition_8_0= 'transition' ) ) ( (otherlv_9= RULE_ID ) ) )? otherlv_10= '{' ( (lv_actions_11_0= ruleStatemachineAction ) )* otherlv_12= '}' )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:682:1: ( () otherlv_1= 'trigger' ( (otherlv_2= RULE_ID ) )* (otherlv_3= 'guards' otherlv_4= '{' ( (lv_guards_5_0= ruleStatemachineGuard ) )* otherlv_6= '}' )? otherlv_7= 'actions' ( ( (lv_hasTransition_8_0= 'transition' ) ) ( (otherlv_9= RULE_ID ) ) )? otherlv_10= '{' ( (lv_actions_11_0= ruleStatemachineAction ) )* otherlv_12= '}' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:682:2: () otherlv_1= 'trigger' ( (otherlv_2= RULE_ID ) )* (otherlv_3= 'guards' otherlv_4= '{' ( (lv_guards_5_0= ruleStatemachineGuard ) )* otherlv_6= '}' )? otherlv_7= 'actions' ( ( (lv_hasTransition_8_0= 'transition' ) ) ( (otherlv_9= RULE_ID ) ) )? otherlv_10= '{' ( (lv_actions_11_0= ruleStatemachineAction ) )* otherlv_12= '}'
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:682:2: ()
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:683:5: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getStatemachineTriggerAccess().getStatemachineTriggerAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,31,FOLLOW_31_in_ruleStatemachineTrigger1470); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineTriggerAccess().getTriggerKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:692:1: ( (otherlv_2= RULE_ID ) )*
+            loop13:
+            do {
+                int alt13=2;
+                int LA13_0 = input.LA(1);
+
+                if ( (LA13_0==RULE_ID) ) {
+                    alt13=1;
+                }
+
+
+                switch (alt13) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:693:1: (otherlv_2= RULE_ID )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:693:1: (otherlv_2= RULE_ID )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:694:3: otherlv_2= RULE_ID
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      			if (current==null) {
+            	      	            current = createModelElement(grammarAccess.getStatemachineTriggerRule());
+            	      	        }
+            	              
+            	    }
+            	    otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineTrigger1490); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      		newLeafNode(otherlv_2, grammarAccess.getStatemachineTriggerAccess().getTriggersStatemachineEventCrossReference_2_0()); 
+            	      	
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop13;
+                }
+            } while (true);
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:705:3: (otherlv_3= 'guards' otherlv_4= '{' ( (lv_guards_5_0= ruleStatemachineGuard ) )* otherlv_6= '}' )?
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0==32) ) {
+                alt15=1;
+            }
+            switch (alt15) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:705:5: otherlv_3= 'guards' otherlv_4= '{' ( (lv_guards_5_0= ruleStatemachineGuard ) )* otherlv_6= '}'
+                    {
+                    otherlv_3=(Token)match(input,32,FOLLOW_32_in_ruleStatemachineTrigger1504); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_3, grammarAccess.getStatemachineTriggerAccess().getGuardsKeyword_3_0());
+                          
+                    }
+                    otherlv_4=(Token)match(input,14,FOLLOW_14_in_ruleStatemachineTrigger1516); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_4, grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_3_1());
+                          
+                    }
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:713:1: ( (lv_guards_5_0= ruleStatemachineGuard ) )*
+                    loop14:
+                    do {
+                        int alt14=2;
+                        int LA14_0 = input.LA(1);
+
+                        if ( (LA14_0==86) ) {
+                            alt14=1;
+                        }
+
+
+                        switch (alt14) {
+                    	case 1 :
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:714:1: (lv_guards_5_0= ruleStatemachineGuard )
+                    	    {
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:714:1: (lv_guards_5_0= ruleStatemachineGuard )
+                    	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:715:3: lv_guards_5_0= ruleStatemachineGuard
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	      	        newCompositeNode(grammarAccess.getStatemachineTriggerAccess().getGuardsStatemachineGuardParserRuleCall_3_2_0()); 
+                    	      	    
+                    	    }
+                    	    pushFollow(FOLLOW_ruleStatemachineGuard_in_ruleStatemachineTrigger1537);
+                    	    lv_guards_5_0=ruleStatemachineGuard();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      	        if (current==null) {
+                    	      	            current = createModelElementForParent(grammarAccess.getStatemachineTriggerRule());
+                    	      	        }
+                    	             		add(
+                    	             			current, 
+                    	             			"guards",
+                    	              		lv_guards_5_0, 
+                    	              		"StatemachineGuard");
+                    	      	        afterParserOrEnumRuleCall();
+                    	      	    
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop14;
+                        }
+                    } while (true);
+
+                    otherlv_6=(Token)match(input,15,FOLLOW_15_in_ruleStatemachineTrigger1550); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_6, grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_3_3());
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_7=(Token)match(input,33,FOLLOW_33_in_ruleStatemachineTrigger1564); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_7, grammarAccess.getStatemachineTriggerAccess().getActionsKeyword_4());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:739:1: ( ( (lv_hasTransition_8_0= 'transition' ) ) ( (otherlv_9= RULE_ID ) ) )?
+            int alt16=2;
+            int LA16_0 = input.LA(1);
+
+            if ( (LA16_0==34) ) {
+                alt16=1;
+            }
+            switch (alt16) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:739:2: ( (lv_hasTransition_8_0= 'transition' ) ) ( (otherlv_9= RULE_ID ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:739:2: ( (lv_hasTransition_8_0= 'transition' ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:740:1: (lv_hasTransition_8_0= 'transition' )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:740:1: (lv_hasTransition_8_0= 'transition' )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:741:3: lv_hasTransition_8_0= 'transition'
+                    {
+                    lv_hasTransition_8_0=(Token)match(input,34,FOLLOW_34_in_ruleStatemachineTrigger1583); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              newLeafNode(lv_hasTransition_8_0, grammarAccess.getStatemachineTriggerAccess().getHasTransitionTransitionKeyword_5_0_0());
+                          
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineTriggerRule());
+                      	        }
+                             		setWithLastConsumed(current, "hasTransition", true, "transition");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:754:2: ( (otherlv_9= RULE_ID ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:755:1: (otherlv_9= RULE_ID )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:755:1: (otherlv_9= RULE_ID )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:756:3: otherlv_9= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineTriggerRule());
+                      	        }
+                              
+                    }
+                    otherlv_9=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineTrigger1616); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      		newLeafNode(otherlv_9, grammarAccess.getStatemachineTriggerAccess().getTransitionStatemachineStateCrossReference_5_1_0()); 
+                      	
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,14,FOLLOW_14_in_ruleStatemachineTrigger1630); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_10, grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_6());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:771:1: ( (lv_actions_11_0= ruleStatemachineAction ) )*
+            loop17:
+            do {
+                int alt17=2;
+                int LA17_0 = input.LA(1);
+
+                if ( ((LA17_0>=34 && LA17_0<=37)||(LA17_0>=44 && LA17_0<=47)||LA17_0==49||(LA17_0>=52 && LA17_0<=60)||(LA17_0>=63 && LA17_0<=66)||LA17_0==68||(LA17_0>=71 && LA17_0<=73)||LA17_0==76||LA17_0==78||(LA17_0>=82 && LA17_0<=83)||LA17_0==88||LA17_0==91||(LA17_0>=100 && LA17_0<=106)||LA17_0==108) ) {
+                    alt17=1;
+                }
+
+
+                switch (alt17) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:772:1: (lv_actions_11_0= ruleStatemachineAction )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:772:1: (lv_actions_11_0= ruleStatemachineAction )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:773:3: lv_actions_11_0= ruleStatemachineAction
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getStatemachineTriggerAccess().getActionsStatemachineActionParserRuleCall_7_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStatemachineAction_in_ruleStatemachineTrigger1651);
+            	    lv_actions_11_0=ruleStatemachineAction();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getStatemachineTriggerRule());
+            	      	        }
+            	             		add(
+            	             			current, 
+            	             			"actions",
+            	              		lv_actions_11_0, 
+            	              		"StatemachineAction");
+            	      	        afterParserOrEnumRuleCall();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop17;
+                }
+            } while (true);
+
+            otherlv_12=(Token)match(input,15,FOLLOW_15_in_ruleStatemachineTrigger1664); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_12, grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_8());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineTrigger"
+
+
+    // $ANTLR start "entryRuleStatemachineAction"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:801:1: entryRuleStatemachineAction returns [EObject current=null] : iv_ruleStatemachineAction= ruleStatemachineAction EOF ;
+    public final EObject entryRuleStatemachineAction() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineAction = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:802:2: (iv_ruleStatemachineAction= ruleStatemachineAction EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:803:2: iv_ruleStatemachineAction= ruleStatemachineAction EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineAction_in_entryRuleStatemachineAction1700);
+            iv_ruleStatemachineAction=ruleStatemachineAction();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineAction; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineAction1710); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineAction"
+
+
+    // $ANTLR start "ruleStatemachineAction"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:810:1: ruleStatemachineAction returns [EObject current=null] : (this_StatemachineActionPeripheralBlinkRate_0= ruleStatemachineActionPeripheralBlinkRate | this_StatemachineActionPeripheralClear_1= ruleStatemachineActionPeripheralClear | this_StatemachineActionPeripheralCreateWindow_2= ruleStatemachineActionPeripheralCreateWindow | this_StatemachineActionPeripheralCursorType_3= ruleStatemachineActionPeripheralCursorType | this_StatemachineActionPeripheralDestroyWindow_4= ruleStatemachineActionPeripheralDestroyWindow | this_StatemachineActionPeripheralDeviceBrightness_5= ruleStatemachineActionPeripheralDeviceBrightness | this_StatemachineActionPeripheralDisplayBitmap_6= ruleStatemachineActionPeripheralDisplayBitmap | this_StatemachineActionPeripheralDisplayText_7= ruleStatemachineActionPeripheralDisplayText | this_StatemachineActionPeripheralDisplayTextAt_8= ruleStatemachineActionPeripheralDisplayTextAt | this_StatemachineActionPeripheralInterCharacterWait_9= ruleStatemachineActionPeripheralInterCharacterWait | this_StatemachineActionPeripheralMarqueeFormat_10= ruleStatemachineActionPeripheralMarqueeFormat | this_StatemachineActionPeripheralMarqueeRepeatWait_11= ruleStatemachineActionPeripheralMarqueeRepeatWait | this_StatemachineActionPeripheralMarqueeType_12= ruleStatemachineActionPeripheralMarqueeType | this_StatemachineActionPeripheralMarqueeUnitWait_13= ruleStatemachineActionPeripheralMarqueeUnitWait | this_StatemachineActionPeripheralScroll_14= ruleStatemachineActionPeripheralScroll | this_StatemachineActionPeripheralOpenDrawer_15= ruleStatemachineActionPeripheralOpenDrawer | this_StatemachineActionPeripheralPrintBarcode_16= ruleStatemachineActionPeripheralPrintBarcode | this_StatemachineActionPeripheralPrintBitmap_17= ruleStatemachineActionPeripheralPrintBitmap | this_StatemachineActionPeripheralPrintCut_18= ruleStatemachineActionPeripheralPrintCut | this_StatemachineActionPeripheralPrintNormal_19= ruleStatemachineActionPeripheralPrintNormal | this_StatemachineActionPeripheralPrintRegisterBitmap_20= ruleStatemachineActionPeripheralPrintRegisterBitmap | this_StatemachineActionPeripheralPTOpen_21= ruleStatemachineActionPeripheralPTOpen | this_StatemachineActionPeripheralPTClose_22= ruleStatemachineActionPeripheralPTClose | this_StatemachineActionPeripheralPTAcknowledge_23= ruleStatemachineActionPeripheralPTAcknowledge | this_StatemachineActionPeripheralPTReversal_24= ruleStatemachineActionPeripheralPTReversal | this_StatemachineActionPeripheralPTRegistration_25= ruleStatemachineActionPeripheralPTRegistration | this_StatemachineActionPeripheralPTAuthorization_26= ruleStatemachineActionPeripheralPTAuthorization | this_StatemachineActionPeripheralPrintReport_27= ruleStatemachineActionPeripheralPrintReport | this_StatemachineActionFieldSet_28= ruleStatemachineActionFieldSet | this_StatemachineActionFieldRemove_29= ruleStatemachineActionFieldRemove | this_StatemachineActionItemVisible_30= ruleStatemachineActionItemVisible | this_StatemachineActionItemInvisible_31= ruleStatemachineActionItemInvisible | this_StatemachineActionFieldClear_32= ruleStatemachineActionFieldClear | this_StatemachineActionButtonCaption_33= ruleStatemachineActionButtonCaption | this_StatemachineActionButtonImage_34= ruleStatemachineActionButtonImage | this_StatemachineActionDTOFind_35= ruleStatemachineActionDTOFind | this_StatemachineStorage_36= ruleStatemachineStorage | this_StatemachineActionScheduler_37= ruleStatemachineActionScheduler | this_StatemachineOperation_38= ruleStatemachineOperation | this_StatemachineActionConditionalTransition_39= ruleStatemachineActionConditionalTransition ) ;
+    public final EObject ruleStatemachineAction() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_StatemachineActionPeripheralBlinkRate_0 = null;
+
+        EObject this_StatemachineActionPeripheralClear_1 = null;
+
+        EObject this_StatemachineActionPeripheralCreateWindow_2 = null;
+
+        EObject this_StatemachineActionPeripheralCursorType_3 = null;
+
+        EObject this_StatemachineActionPeripheralDestroyWindow_4 = null;
+
+        EObject this_StatemachineActionPeripheralDeviceBrightness_5 = null;
+
+        EObject this_StatemachineActionPeripheralDisplayBitmap_6 = null;
+
+        EObject this_StatemachineActionPeripheralDisplayText_7 = null;
+
+        EObject this_StatemachineActionPeripheralDisplayTextAt_8 = null;
+
+        EObject this_StatemachineActionPeripheralInterCharacterWait_9 = null;
+
+        EObject this_StatemachineActionPeripheralMarqueeFormat_10 = null;
+
+        EObject this_StatemachineActionPeripheralMarqueeRepeatWait_11 = null;
+
+        EObject this_StatemachineActionPeripheralMarqueeType_12 = null;
+
+        EObject this_StatemachineActionPeripheralMarqueeUnitWait_13 = null;
+
+        EObject this_StatemachineActionPeripheralScroll_14 = null;
+
+        EObject this_StatemachineActionPeripheralOpenDrawer_15 = null;
+
+        EObject this_StatemachineActionPeripheralPrintBarcode_16 = null;
+
+        EObject this_StatemachineActionPeripheralPrintBitmap_17 = null;
+
+        EObject this_StatemachineActionPeripheralPrintCut_18 = null;
+
+        EObject this_StatemachineActionPeripheralPrintNormal_19 = null;
+
+        EObject this_StatemachineActionPeripheralPrintRegisterBitmap_20 = null;
+
+        EObject this_StatemachineActionPeripheralPTOpen_21 = null;
+
+        EObject this_StatemachineActionPeripheralPTClose_22 = null;
+
+        EObject this_StatemachineActionPeripheralPTAcknowledge_23 = null;
+
+        EObject this_StatemachineActionPeripheralPTReversal_24 = null;
+
+        EObject this_StatemachineActionPeripheralPTRegistration_25 = null;
+
+        EObject this_StatemachineActionPeripheralPTAuthorization_26 = null;
+
+        EObject this_StatemachineActionPeripheralPrintReport_27 = null;
+
+        EObject this_StatemachineActionFieldSet_28 = null;
+
+        EObject this_StatemachineActionFieldRemove_29 = null;
+
+        EObject this_StatemachineActionItemVisible_30 = null;
+
+        EObject this_StatemachineActionItemInvisible_31 = null;
+
+        EObject this_StatemachineActionFieldClear_32 = null;
+
+        EObject this_StatemachineActionButtonCaption_33 = null;
+
+        EObject this_StatemachineActionButtonImage_34 = null;
+
+        EObject this_StatemachineActionDTOFind_35 = null;
+
+        EObject this_StatemachineStorage_36 = null;
+
+        EObject this_StatemachineActionScheduler_37 = null;
+
+        EObject this_StatemachineOperation_38 = null;
+
+        EObject this_StatemachineActionConditionalTransition_39 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:813:28: ( (this_StatemachineActionPeripheralBlinkRate_0= ruleStatemachineActionPeripheralBlinkRate | this_StatemachineActionPeripheralClear_1= ruleStatemachineActionPeripheralClear | this_StatemachineActionPeripheralCreateWindow_2= ruleStatemachineActionPeripheralCreateWindow | this_StatemachineActionPeripheralCursorType_3= ruleStatemachineActionPeripheralCursorType | this_StatemachineActionPeripheralDestroyWindow_4= ruleStatemachineActionPeripheralDestroyWindow | this_StatemachineActionPeripheralDeviceBrightness_5= ruleStatemachineActionPeripheralDeviceBrightness | this_StatemachineActionPeripheralDisplayBitmap_6= ruleStatemachineActionPeripheralDisplayBitmap | this_StatemachineActionPeripheralDisplayText_7= ruleStatemachineActionPeripheralDisplayText | this_StatemachineActionPeripheralDisplayTextAt_8= ruleStatemachineActionPeripheralDisplayTextAt | this_StatemachineActionPeripheralInterCharacterWait_9= ruleStatemachineActionPeripheralInterCharacterWait | this_StatemachineActionPeripheralMarqueeFormat_10= ruleStatemachineActionPeripheralMarqueeFormat | this_StatemachineActionPeripheralMarqueeRepeatWait_11= ruleStatemachineActionPeripheralMarqueeRepeatWait | this_StatemachineActionPeripheralMarqueeType_12= ruleStatemachineActionPeripheralMarqueeType | this_StatemachineActionPeripheralMarqueeUnitWait_13= ruleStatemachineActionPeripheralMarqueeUnitWait | this_StatemachineActionPeripheralScroll_14= ruleStatemachineActionPeripheralScroll | this_StatemachineActionPeripheralOpenDrawer_15= ruleStatemachineActionPeripheralOpenDrawer | this_StatemachineActionPeripheralPrintBarcode_16= ruleStatemachineActionPeripheralPrintBarcode | this_StatemachineActionPeripheralPrintBitmap_17= ruleStatemachineActionPeripheralPrintBitmap | this_StatemachineActionPeripheralPrintCut_18= ruleStatemachineActionPeripheralPrintCut | this_StatemachineActionPeripheralPrintNormal_19= ruleStatemachineActionPeripheralPrintNormal | this_StatemachineActionPeripheralPrintRegisterBitmap_20= ruleStatemachineActionPeripheralPrintRegisterBitmap | this_StatemachineActionPeripheralPTOpen_21= ruleStatemachineActionPeripheralPTOpen | this_StatemachineActionPeripheralPTClose_22= ruleStatemachineActionPeripheralPTClose | this_StatemachineActionPeripheralPTAcknowledge_23= ruleStatemachineActionPeripheralPTAcknowledge | this_StatemachineActionPeripheralPTReversal_24= ruleStatemachineActionPeripheralPTReversal | this_StatemachineActionPeripheralPTRegistration_25= ruleStatemachineActionPeripheralPTRegistration | this_StatemachineActionPeripheralPTAuthorization_26= ruleStatemachineActionPeripheralPTAuthorization | this_StatemachineActionPeripheralPrintReport_27= ruleStatemachineActionPeripheralPrintReport | this_StatemachineActionFieldSet_28= ruleStatemachineActionFieldSet | this_StatemachineActionFieldRemove_29= ruleStatemachineActionFieldRemove | this_StatemachineActionItemVisible_30= ruleStatemachineActionItemVisible | this_StatemachineActionItemInvisible_31= ruleStatemachineActionItemInvisible | this_StatemachineActionFieldClear_32= ruleStatemachineActionFieldClear | this_StatemachineActionButtonCaption_33= ruleStatemachineActionButtonCaption | this_StatemachineActionButtonImage_34= ruleStatemachineActionButtonImage | this_StatemachineActionDTOFind_35= ruleStatemachineActionDTOFind | this_StatemachineStorage_36= ruleStatemachineStorage | this_StatemachineActionScheduler_37= ruleStatemachineActionScheduler | this_StatemachineOperation_38= ruleStatemachineOperation | this_StatemachineActionConditionalTransition_39= ruleStatemachineActionConditionalTransition ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:814:1: (this_StatemachineActionPeripheralBlinkRate_0= ruleStatemachineActionPeripheralBlinkRate | this_StatemachineActionPeripheralClear_1= ruleStatemachineActionPeripheralClear | this_StatemachineActionPeripheralCreateWindow_2= ruleStatemachineActionPeripheralCreateWindow | this_StatemachineActionPeripheralCursorType_3= ruleStatemachineActionPeripheralCursorType | this_StatemachineActionPeripheralDestroyWindow_4= ruleStatemachineActionPeripheralDestroyWindow | this_StatemachineActionPeripheralDeviceBrightness_5= ruleStatemachineActionPeripheralDeviceBrightness | this_StatemachineActionPeripheralDisplayBitmap_6= ruleStatemachineActionPeripheralDisplayBitmap | this_StatemachineActionPeripheralDisplayText_7= ruleStatemachineActionPeripheralDisplayText | this_StatemachineActionPeripheralDisplayTextAt_8= ruleStatemachineActionPeripheralDisplayTextAt | this_StatemachineActionPeripheralInterCharacterWait_9= ruleStatemachineActionPeripheralInterCharacterWait | this_StatemachineActionPeripheralMarqueeFormat_10= ruleStatemachineActionPeripheralMarqueeFormat | this_StatemachineActionPeripheralMarqueeRepeatWait_11= ruleStatemachineActionPeripheralMarqueeRepeatWait | this_StatemachineActionPeripheralMarqueeType_12= ruleStatemachineActionPeripheralMarqueeType | this_StatemachineActionPeripheralMarqueeUnitWait_13= ruleStatemachineActionPeripheralMarqueeUnitWait | this_StatemachineActionPeripheralScroll_14= ruleStatemachineActionPeripheralScroll | this_StatemachineActionPeripheralOpenDrawer_15= ruleStatemachineActionPeripheralOpenDrawer | this_StatemachineActionPeripheralPrintBarcode_16= ruleStatemachineActionPeripheralPrintBarcode | this_StatemachineActionPeripheralPrintBitmap_17= ruleStatemachineActionPeripheralPrintBitmap | this_StatemachineActionPeripheralPrintCut_18= ruleStatemachineActionPeripheralPrintCut | this_StatemachineActionPeripheralPrintNormal_19= ruleStatemachineActionPeripheralPrintNormal | this_StatemachineActionPeripheralPrintRegisterBitmap_20= ruleStatemachineActionPeripheralPrintRegisterBitmap | this_StatemachineActionPeripheralPTOpen_21= ruleStatemachineActionPeripheralPTOpen | this_StatemachineActionPeripheralPTClose_22= ruleStatemachineActionPeripheralPTClose | this_StatemachineActionPeripheralPTAcknowledge_23= ruleStatemachineActionPeripheralPTAcknowledge | this_StatemachineActionPeripheralPTReversal_24= ruleStatemachineActionPeripheralPTReversal | this_StatemachineActionPeripheralPTRegistration_25= ruleStatemachineActionPeripheralPTRegistration | this_StatemachineActionPeripheralPTAuthorization_26= ruleStatemachineActionPeripheralPTAuthorization | this_StatemachineActionPeripheralPrintReport_27= ruleStatemachineActionPeripheralPrintReport | this_StatemachineActionFieldSet_28= ruleStatemachineActionFieldSet | this_StatemachineActionFieldRemove_29= ruleStatemachineActionFieldRemove | this_StatemachineActionItemVisible_30= ruleStatemachineActionItemVisible | this_StatemachineActionItemInvisible_31= ruleStatemachineActionItemInvisible | this_StatemachineActionFieldClear_32= ruleStatemachineActionFieldClear | this_StatemachineActionButtonCaption_33= ruleStatemachineActionButtonCaption | this_StatemachineActionButtonImage_34= ruleStatemachineActionButtonImage | this_StatemachineActionDTOFind_35= ruleStatemachineActionDTOFind | this_StatemachineStorage_36= ruleStatemachineStorage | this_StatemachineActionScheduler_37= ruleStatemachineActionScheduler | this_StatemachineOperation_38= ruleStatemachineOperation | this_StatemachineActionConditionalTransition_39= ruleStatemachineActionConditionalTransition )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:814:1: (this_StatemachineActionPeripheralBlinkRate_0= ruleStatemachineActionPeripheralBlinkRate | this_StatemachineActionPeripheralClear_1= ruleStatemachineActionPeripheralClear | this_StatemachineActionPeripheralCreateWindow_2= ruleStatemachineActionPeripheralCreateWindow | this_StatemachineActionPeripheralCursorType_3= ruleStatemachineActionPeripheralCursorType | this_StatemachineActionPeripheralDestroyWindow_4= ruleStatemachineActionPeripheralDestroyWindow | this_StatemachineActionPeripheralDeviceBrightness_5= ruleStatemachineActionPeripheralDeviceBrightness | this_StatemachineActionPeripheralDisplayBitmap_6= ruleStatemachineActionPeripheralDisplayBitmap | this_StatemachineActionPeripheralDisplayText_7= ruleStatemachineActionPeripheralDisplayText | this_StatemachineActionPeripheralDisplayTextAt_8= ruleStatemachineActionPeripheralDisplayTextAt | this_StatemachineActionPeripheralInterCharacterWait_9= ruleStatemachineActionPeripheralInterCharacterWait | this_StatemachineActionPeripheralMarqueeFormat_10= ruleStatemachineActionPeripheralMarqueeFormat | this_StatemachineActionPeripheralMarqueeRepeatWait_11= ruleStatemachineActionPeripheralMarqueeRepeatWait | this_StatemachineActionPeripheralMarqueeType_12= ruleStatemachineActionPeripheralMarqueeType | this_StatemachineActionPeripheralMarqueeUnitWait_13= ruleStatemachineActionPeripheralMarqueeUnitWait | this_StatemachineActionPeripheralScroll_14= ruleStatemachineActionPeripheralScroll | this_StatemachineActionPeripheralOpenDrawer_15= ruleStatemachineActionPeripheralOpenDrawer | this_StatemachineActionPeripheralPrintBarcode_16= ruleStatemachineActionPeripheralPrintBarcode | this_StatemachineActionPeripheralPrintBitmap_17= ruleStatemachineActionPeripheralPrintBitmap | this_StatemachineActionPeripheralPrintCut_18= ruleStatemachineActionPeripheralPrintCut | this_StatemachineActionPeripheralPrintNormal_19= ruleStatemachineActionPeripheralPrintNormal | this_StatemachineActionPeripheralPrintRegisterBitmap_20= ruleStatemachineActionPeripheralPrintRegisterBitmap | this_StatemachineActionPeripheralPTOpen_21= ruleStatemachineActionPeripheralPTOpen | this_StatemachineActionPeripheralPTClose_22= ruleStatemachineActionPeripheralPTClose | this_StatemachineActionPeripheralPTAcknowledge_23= ruleStatemachineActionPeripheralPTAcknowledge | this_StatemachineActionPeripheralPTReversal_24= ruleStatemachineActionPeripheralPTReversal | this_StatemachineActionPeripheralPTRegistration_25= ruleStatemachineActionPeripheralPTRegistration | this_StatemachineActionPeripheralPTAuthorization_26= ruleStatemachineActionPeripheralPTAuthorization | this_StatemachineActionPeripheralPrintReport_27= ruleStatemachineActionPeripheralPrintReport | this_StatemachineActionFieldSet_28= ruleStatemachineActionFieldSet | this_StatemachineActionFieldRemove_29= ruleStatemachineActionFieldRemove | this_StatemachineActionItemVisible_30= ruleStatemachineActionItemVisible | this_StatemachineActionItemInvisible_31= ruleStatemachineActionItemInvisible | this_StatemachineActionFieldClear_32= ruleStatemachineActionFieldClear | this_StatemachineActionButtonCaption_33= ruleStatemachineActionButtonCaption | this_StatemachineActionButtonImage_34= ruleStatemachineActionButtonImage | this_StatemachineActionDTOFind_35= ruleStatemachineActionDTOFind | this_StatemachineStorage_36= ruleStatemachineStorage | this_StatemachineActionScheduler_37= ruleStatemachineActionScheduler | this_StatemachineOperation_38= ruleStatemachineOperation | this_StatemachineActionConditionalTransition_39= ruleStatemachineActionConditionalTransition )
+            int alt18=40;
+            switch ( input.LA(1) ) {
+            case 35:
+                {
+                alt18=1;
+                }
+                break;
+            case 36:
+                {
+                alt18=2;
+                }
+                break;
+            case 37:
+                {
+                alt18=3;
+                }
+                break;
+            case 44:
+                {
+                alt18=4;
+                }
+                break;
+            case 45:
+                {
+                alt18=5;
+                }
+                break;
+            case 46:
+                {
+                alt18=6;
+                }
+                break;
+            case 47:
+                {
+                alt18=7;
+                }
+                break;
+            case 49:
+                {
+                alt18=8;
+                }
+                break;
+            case 52:
+                {
+                alt18=9;
+                }
+                break;
+            case 53:
+                {
+                alt18=10;
+                }
+                break;
+            case 54:
+                {
+                alt18=11;
+                }
+                break;
+            case 55:
+                {
+                alt18=12;
+                }
+                break;
+            case 56:
+                {
+                alt18=13;
+                }
+                break;
+            case 57:
+                {
+                alt18=14;
+                }
+                break;
+            case 58:
+                {
+                alt18=15;
+                }
+                break;
+            case 59:
+                {
+                alt18=16;
+                }
+                break;
+            case 60:
+                {
+                alt18=17;
+                }
+                break;
+            case 63:
+                {
+                alt18=18;
+                }
+                break;
+            case 64:
+                {
+                alt18=19;
+                }
+                break;
+            case 65:
+                {
+                alt18=20;
+                }
+                break;
+            case 66:
+                {
+                alt18=21;
+                }
+                break;
+            case 68:
+                {
+                alt18=22;
+                }
+                break;
+            case 71:
+                {
+                alt18=23;
+                }
+                break;
+            case 72:
+                {
+                alt18=24;
+                }
+                break;
+            case 73:
+                {
+                alt18=25;
+                }
+                break;
+            case 76:
+                {
+                alt18=26;
+                }
+                break;
+            case 78:
+                {
+                alt18=27;
+                }
+                break;
+            case 82:
+                {
+                alt18=28;
+                }
+                break;
+            case 100:
+                {
+                alt18=29;
+                }
+                break;
+            case 102:
+                {
+                alt18=30;
+                }
+                break;
+            case 103:
+                {
+                alt18=31;
+                }
+                break;
+            case 104:
+                {
+                alt18=32;
+                }
+                break;
+            case 101:
+                {
+                alt18=33;
+                }
+                break;
+            case 88:
+                {
+                alt18=34;
+                }
+                break;
+            case 105:
+                {
+                alt18=35;
+                }
+                break;
+            case 106:
+                {
+                alt18=36;
+                }
+                break;
+            case 91:
+                {
+                alt18=37;
+                }
+                break;
+            case 108:
+                {
+                alt18=38;
+                }
+                break;
+            case 83:
+                {
+                alt18=39;
+                }
+                break;
+            case 34:
+                {
+                alt18=40;
+                }
+                break;
+            default:
+                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.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:815:5: this_StatemachineActionPeripheralBlinkRate_0= ruleStatemachineActionPeripheralBlinkRate
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralBlinkRateParserRuleCall_0()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralBlinkRate_in_ruleStatemachineAction1757);
+                    this_StatemachineActionPeripheralBlinkRate_0=ruleStatemachineActionPeripheralBlinkRate();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralBlinkRate_0; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:825:5: this_StatemachineActionPeripheralClear_1= ruleStatemachineActionPeripheralClear
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralClearParserRuleCall_1()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralClear_in_ruleStatemachineAction1784);
+                    this_StatemachineActionPeripheralClear_1=ruleStatemachineActionPeripheralClear();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralClear_1; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:835:5: this_StatemachineActionPeripheralCreateWindow_2= ruleStatemachineActionPeripheralCreateWindow
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCreateWindowParserRuleCall_2()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralCreateWindow_in_ruleStatemachineAction1811);
+                    this_StatemachineActionPeripheralCreateWindow_2=ruleStatemachineActionPeripheralCreateWindow();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralCreateWindow_2; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:845:5: this_StatemachineActionPeripheralCursorType_3= ruleStatemachineActionPeripheralCursorType
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCursorTypeParserRuleCall_3()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralCursorType_in_ruleStatemachineAction1838);
+                    this_StatemachineActionPeripheralCursorType_3=ruleStatemachineActionPeripheralCursorType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralCursorType_3; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:855:5: this_StatemachineActionPeripheralDestroyWindow_4= ruleStatemachineActionPeripheralDestroyWindow
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDestroyWindowParserRuleCall_4()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralDestroyWindow_in_ruleStatemachineAction1865);
+                    this_StatemachineActionPeripheralDestroyWindow_4=ruleStatemachineActionPeripheralDestroyWindow();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralDestroyWindow_4; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:865:5: this_StatemachineActionPeripheralDeviceBrightness_5= ruleStatemachineActionPeripheralDeviceBrightness
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralDeviceBrightness_in_ruleStatemachineAction1892);
+                    this_StatemachineActionPeripheralDeviceBrightness_5=ruleStatemachineActionPeripheralDeviceBrightness();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralDeviceBrightness_5; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:875:5: this_StatemachineActionPeripheralDisplayBitmap_6= ruleStatemachineActionPeripheralDisplayBitmap
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayBitmapParserRuleCall_6()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralDisplayBitmap_in_ruleStatemachineAction1919);
+                    this_StatemachineActionPeripheralDisplayBitmap_6=ruleStatemachineActionPeripheralDisplayBitmap();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralDisplayBitmap_6; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:885:5: this_StatemachineActionPeripheralDisplayText_7= ruleStatemachineActionPeripheralDisplayText
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextParserRuleCall_7()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralDisplayText_in_ruleStatemachineAction1946);
+                    this_StatemachineActionPeripheralDisplayText_7=ruleStatemachineActionPeripheralDisplayText();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralDisplayText_7; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:895:5: this_StatemachineActionPeripheralDisplayTextAt_8= ruleStatemachineActionPeripheralDisplayTextAt
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextAtParserRuleCall_8()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralDisplayTextAt_in_ruleStatemachineAction1973);
+                    this_StatemachineActionPeripheralDisplayTextAt_8=ruleStatemachineActionPeripheralDisplayTextAt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralDisplayTextAt_8; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:905:5: this_StatemachineActionPeripheralInterCharacterWait_9= ruleStatemachineActionPeripheralInterCharacterWait
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralInterCharacterWait_in_ruleStatemachineAction2000);
+                    this_StatemachineActionPeripheralInterCharacterWait_9=ruleStatemachineActionPeripheralInterCharacterWait();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralInterCharacterWait_9; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 11 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:915:5: this_StatemachineActionPeripheralMarqueeFormat_10= ruleStatemachineActionPeripheralMarqueeFormat
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeFormatParserRuleCall_10()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralMarqueeFormat_in_ruleStatemachineAction2027);
+                    this_StatemachineActionPeripheralMarqueeFormat_10=ruleStatemachineActionPeripheralMarqueeFormat();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralMarqueeFormat_10; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:925:5: this_StatemachineActionPeripheralMarqueeRepeatWait_11= ruleStatemachineActionPeripheralMarqueeRepeatWait
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralMarqueeRepeatWait_in_ruleStatemachineAction2054);
+                    this_StatemachineActionPeripheralMarqueeRepeatWait_11=ruleStatemachineActionPeripheralMarqueeRepeatWait();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralMarqueeRepeatWait_11; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 13 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:935:5: this_StatemachineActionPeripheralMarqueeType_12= ruleStatemachineActionPeripheralMarqueeType
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeTypeParserRuleCall_12()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralMarqueeType_in_ruleStatemachineAction2081);
+                    this_StatemachineActionPeripheralMarqueeType_12=ruleStatemachineActionPeripheralMarqueeType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralMarqueeType_12; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 14 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:945:5: this_StatemachineActionPeripheralMarqueeUnitWait_13= ruleStatemachineActionPeripheralMarqueeUnitWait
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralMarqueeUnitWait_in_ruleStatemachineAction2108);
+                    this_StatemachineActionPeripheralMarqueeUnitWait_13=ruleStatemachineActionPeripheralMarqueeUnitWait();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralMarqueeUnitWait_13; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 15 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:955:5: this_StatemachineActionPeripheralScroll_14= ruleStatemachineActionPeripheralScroll
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralScrollParserRuleCall_14()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralScroll_in_ruleStatemachineAction2135);
+                    this_StatemachineActionPeripheralScroll_14=ruleStatemachineActionPeripheralScroll();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralScroll_14; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 16 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:965:5: this_StatemachineActionPeripheralOpenDrawer_15= ruleStatemachineActionPeripheralOpenDrawer
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralOpenDrawerParserRuleCall_15()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralOpenDrawer_in_ruleStatemachineAction2162);
+                    this_StatemachineActionPeripheralOpenDrawer_15=ruleStatemachineActionPeripheralOpenDrawer();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralOpenDrawer_15; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 17 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:975:5: this_StatemachineActionPeripheralPrintBarcode_16= ruleStatemachineActionPeripheralPrintBarcode
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBarcodeParserRuleCall_16()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintBarcode_in_ruleStatemachineAction2189);
+                    this_StatemachineActionPeripheralPrintBarcode_16=ruleStatemachineActionPeripheralPrintBarcode();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPrintBarcode_16; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 18 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:985:5: this_StatemachineActionPeripheralPrintBitmap_17= ruleStatemachineActionPeripheralPrintBitmap
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBitmapParserRuleCall_17()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintBitmap_in_ruleStatemachineAction2216);
+                    this_StatemachineActionPeripheralPrintBitmap_17=ruleStatemachineActionPeripheralPrintBitmap();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPrintBitmap_17; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 19 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:995:5: this_StatemachineActionPeripheralPrintCut_18= ruleStatemachineActionPeripheralPrintCut
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintCutParserRuleCall_18()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintCut_in_ruleStatemachineAction2243);
+                    this_StatemachineActionPeripheralPrintCut_18=ruleStatemachineActionPeripheralPrintCut();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPrintCut_18; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 20 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1005:5: this_StatemachineActionPeripheralPrintNormal_19= ruleStatemachineActionPeripheralPrintNormal
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintNormalParserRuleCall_19()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintNormal_in_ruleStatemachineAction2270);
+                    this_StatemachineActionPeripheralPrintNormal_19=ruleStatemachineActionPeripheralPrintNormal();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPrintNormal_19; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 21 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1015:5: this_StatemachineActionPeripheralPrintRegisterBitmap_20= ruleStatemachineActionPeripheralPrintRegisterBitmap
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintRegisterBitmap_in_ruleStatemachineAction2297);
+                    this_StatemachineActionPeripheralPrintRegisterBitmap_20=ruleStatemachineActionPeripheralPrintRegisterBitmap();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPrintRegisterBitmap_20; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 22 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1025:5: this_StatemachineActionPeripheralPTOpen_21= ruleStatemachineActionPeripheralPTOpen
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTOpenParserRuleCall_21()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTOpen_in_ruleStatemachineAction2324);
+                    this_StatemachineActionPeripheralPTOpen_21=ruleStatemachineActionPeripheralPTOpen();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPTOpen_21; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 23 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1035:5: this_StatemachineActionPeripheralPTClose_22= ruleStatemachineActionPeripheralPTClose
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTCloseParserRuleCall_22()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTClose_in_ruleStatemachineAction2351);
+                    this_StatemachineActionPeripheralPTClose_22=ruleStatemachineActionPeripheralPTClose();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPTClose_22; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 24 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1045:5: this_StatemachineActionPeripheralPTAcknowledge_23= ruleStatemachineActionPeripheralPTAcknowledge
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTAcknowledge_in_ruleStatemachineAction2378);
+                    this_StatemachineActionPeripheralPTAcknowledge_23=ruleStatemachineActionPeripheralPTAcknowledge();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPTAcknowledge_23; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 25 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1055:5: this_StatemachineActionPeripheralPTReversal_24= ruleStatemachineActionPeripheralPTReversal
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTReversalParserRuleCall_24()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTReversal_in_ruleStatemachineAction2405);
+                    this_StatemachineActionPeripheralPTReversal_24=ruleStatemachineActionPeripheralPTReversal();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPTReversal_24; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 26 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1065:5: this_StatemachineActionPeripheralPTRegistration_25= ruleStatemachineActionPeripheralPTRegistration
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTRegistrationParserRuleCall_25()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTRegistration_in_ruleStatemachineAction2432);
+                    this_StatemachineActionPeripheralPTRegistration_25=ruleStatemachineActionPeripheralPTRegistration();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPTRegistration_25; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 27 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1075:5: this_StatemachineActionPeripheralPTAuthorization_26= ruleStatemachineActionPeripheralPTAuthorization
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAuthorizationParserRuleCall_26()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTAuthorization_in_ruleStatemachineAction2459);
+                    this_StatemachineActionPeripheralPTAuthorization_26=ruleStatemachineActionPeripheralPTAuthorization();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPTAuthorization_26; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 28 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1085:5: this_StatemachineActionPeripheralPrintReport_27= ruleStatemachineActionPeripheralPrintReport
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintReportParserRuleCall_27()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintReport_in_ruleStatemachineAction2486);
+                    this_StatemachineActionPeripheralPrintReport_27=ruleStatemachineActionPeripheralPrintReport();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPrintReport_27; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 29 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1095:5: this_StatemachineActionFieldSet_28= ruleStatemachineActionFieldSet
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldSetParserRuleCall_28()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldSet_in_ruleStatemachineAction2513);
+                    this_StatemachineActionFieldSet_28=ruleStatemachineActionFieldSet();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldSet_28; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 30 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1105:5: this_StatemachineActionFieldRemove_29= ruleStatemachineActionFieldRemove
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldRemoveParserRuleCall_29()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldRemove_in_ruleStatemachineAction2540);
+                    this_StatemachineActionFieldRemove_29=ruleStatemachineActionFieldRemove();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldRemove_29; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 31 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1115:5: this_StatemachineActionItemVisible_30= ruleStatemachineActionItemVisible
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemVisibleParserRuleCall_30()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionItemVisible_in_ruleStatemachineAction2567);
+                    this_StatemachineActionItemVisible_30=ruleStatemachineActionItemVisible();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionItemVisible_30; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 32 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1125:5: this_StatemachineActionItemInvisible_31= ruleStatemachineActionItemInvisible
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemInvisibleParserRuleCall_31()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionItemInvisible_in_ruleStatemachineAction2594);
+                    this_StatemachineActionItemInvisible_31=ruleStatemachineActionItemInvisible();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionItemInvisible_31; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 33 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1135:5: this_StatemachineActionFieldClear_32= ruleStatemachineActionFieldClear
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldClearParserRuleCall_32()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldClear_in_ruleStatemachineAction2621);
+                    this_StatemachineActionFieldClear_32=ruleStatemachineActionFieldClear();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldClear_32; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 34 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1145:5: this_StatemachineActionButtonCaption_33= ruleStatemachineActionButtonCaption
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonCaptionParserRuleCall_33()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionButtonCaption_in_ruleStatemachineAction2648);
+                    this_StatemachineActionButtonCaption_33=ruleStatemachineActionButtonCaption();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionButtonCaption_33; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 35 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1155:5: this_StatemachineActionButtonImage_34= ruleStatemachineActionButtonImage
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonImageParserRuleCall_34()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionButtonImage_in_ruleStatemachineAction2675);
+                    this_StatemachineActionButtonImage_34=ruleStatemachineActionButtonImage();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionButtonImage_34; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 36 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1165:5: this_StatemachineActionDTOFind_35= ruleStatemachineActionDTOFind
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionDTOFindParserRuleCall_35()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionDTOFind_in_ruleStatemachineAction2702);
+                    this_StatemachineActionDTOFind_35=ruleStatemachineActionDTOFind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionDTOFind_35; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 37 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1175:5: this_StatemachineStorage_36= ruleStatemachineStorage
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineStorageParserRuleCall_36()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineStorage_in_ruleStatemachineAction2729);
+                    this_StatemachineStorage_36=ruleStatemachineStorage();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineStorage_36; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 38 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1185:5: this_StatemachineActionScheduler_37= ruleStatemachineActionScheduler
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionSchedulerParserRuleCall_37()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionScheduler_in_ruleStatemachineAction2756);
+                    this_StatemachineActionScheduler_37=ruleStatemachineActionScheduler();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionScheduler_37; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 39 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1195:5: this_StatemachineOperation_38= ruleStatemachineOperation
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineOperationParserRuleCall_38()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineOperation_in_ruleStatemachineAction2783);
+                    this_StatemachineOperation_38=ruleStatemachineOperation();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineOperation_38; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 40 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1205:5: this_StatemachineActionConditionalTransition_39= ruleStatemachineActionConditionalTransition
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionAccess().getStatemachineActionConditionalTransitionParserRuleCall_39()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionConditionalTransition_in_ruleStatemachineAction2810);
+                    this_StatemachineActionConditionalTransition_39=ruleStatemachineActionConditionalTransition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionConditionalTransition_39; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineAction"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralBlinkRate"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1221:1: entryRuleStatemachineActionPeripheralBlinkRate returns [EObject current=null] : iv_ruleStatemachineActionPeripheralBlinkRate= ruleStatemachineActionPeripheralBlinkRate EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralBlinkRate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralBlinkRate = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1222:2: (iv_ruleStatemachineActionPeripheralBlinkRate= ruleStatemachineActionPeripheralBlinkRate EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1223:2: iv_ruleStatemachineActionPeripheralBlinkRate= ruleStatemachineActionPeripheralBlinkRate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralBlinkRateRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralBlinkRate_in_entryRuleStatemachineActionPeripheralBlinkRate2845);
+            iv_ruleStatemachineActionPeripheralBlinkRate=ruleStatemachineActionPeripheralBlinkRate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralBlinkRate; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralBlinkRate2855); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralBlinkRate"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralBlinkRate"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1230:1: ruleStatemachineActionPeripheralBlinkRate returns [EObject current=null] : (otherlv_0= 'blinkRate' ( (lv_blinkRate_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralBlinkRate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_blinkRate_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1233:28: ( (otherlv_0= 'blinkRate' ( (lv_blinkRate_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1234:1: (otherlv_0= 'blinkRate' ( (lv_blinkRate_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1234:1: (otherlv_0= 'blinkRate' ( (lv_blinkRate_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1234:3: otherlv_0= 'blinkRate' ( (lv_blinkRate_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,35,FOLLOW_35_in_ruleStatemachineActionPeripheralBlinkRate2892); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1238:1: ( (lv_blinkRate_1_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1239:1: (lv_blinkRate_1_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1239:1: (lv_blinkRate_1_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1240:3: lv_blinkRate_1_0= RULE_INT
+            {
+            lv_blinkRate_1_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralBlinkRate2909); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_blinkRate_1_0, grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateINTTerminalRuleCall_1_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralBlinkRateRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"blinkRate",
+                      		lv_blinkRate_1_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralBlinkRate2926); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getCommercialAtKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1260:1: ( (otherlv_3= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1261:1: (otherlv_3= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1261:1: (otherlv_3= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1262:3: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralBlinkRateRule());
+              	        }
+                      
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralBlinkRate2946); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralBlinkRate"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralClear"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1281:1: entryRuleStatemachineActionPeripheralClear returns [EObject current=null] : iv_ruleStatemachineActionPeripheralClear= ruleStatemachineActionPeripheralClear EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralClear() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralClear = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1282:2: (iv_ruleStatemachineActionPeripheralClear= ruleStatemachineActionPeripheralClear EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1283:2: iv_ruleStatemachineActionPeripheralClear= ruleStatemachineActionPeripheralClear EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralClearRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralClear_in_entryRuleStatemachineActionPeripheralClear2982);
+            iv_ruleStatemachineActionPeripheralClear=ruleStatemachineActionPeripheralClear();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralClear; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralClear2992); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralClear"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralClear"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1290:1: ruleStatemachineActionPeripheralClear returns [EObject current=null] : (otherlv_0= 'clearDevice' ( (otherlv_1= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralClear() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1293:28: ( (otherlv_0= 'clearDevice' ( (otherlv_1= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1294:1: (otherlv_0= 'clearDevice' ( (otherlv_1= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1294:1: (otherlv_0= 'clearDevice' ( (otherlv_1= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1294:3: otherlv_0= 'clearDevice' ( (otherlv_1= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,36,FOLLOW_36_in_ruleStatemachineActionPeripheralClear3029); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralClearAccess().getClearDeviceKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1298:1: ( (otherlv_1= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1299:1: (otherlv_1= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1299:1: (otherlv_1= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1300:3: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralClearRule());
+              	        }
+                      
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralClear3049); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralClearAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralClear"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralCreateWindow"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1319:1: entryRuleStatemachineActionPeripheralCreateWindow returns [EObject current=null] : iv_ruleStatemachineActionPeripheralCreateWindow= ruleStatemachineActionPeripheralCreateWindow EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralCreateWindow() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralCreateWindow = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1320:2: (iv_ruleStatemachineActionPeripheralCreateWindow= ruleStatemachineActionPeripheralCreateWindow EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1321:2: iv_ruleStatemachineActionPeripheralCreateWindow= ruleStatemachineActionPeripheralCreateWindow EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralCreateWindowRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralCreateWindow_in_entryRuleStatemachineActionPeripheralCreateWindow3085);
+            iv_ruleStatemachineActionPeripheralCreateWindow=ruleStatemachineActionPeripheralCreateWindow();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralCreateWindow; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralCreateWindow3095); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralCreateWindow"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralCreateWindow"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1328:1: ruleStatemachineActionPeripheralCreateWindow returns [EObject current=null] : (otherlv_0= 'createWindow' otherlv_1= 'row' ( (lv_viewportRow_2_0= RULE_INT ) ) otherlv_3= 'column' ( (lv_viewportColumn_4_0= RULE_INT ) ) otherlv_5= 'height' ( (lv_viewportHeight_6_0= RULE_INT ) ) otherlv_7= 'width' ( (lv_viewportWidth_8_0= RULE_INT ) ) otherlv_9= 'windowHeight' ( (lv_windowHeight_10_0= RULE_INT ) ) otherlv_11= 'windowWidth' ( (lv_windowWidth_12_0= RULE_INT ) ) otherlv_13= '@' ( (otherlv_14= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralCreateWindow() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_viewportRow_2_0=null;
+        Token otherlv_3=null;
+        Token lv_viewportColumn_4_0=null;
+        Token otherlv_5=null;
+        Token lv_viewportHeight_6_0=null;
+        Token otherlv_7=null;
+        Token lv_viewportWidth_8_0=null;
+        Token otherlv_9=null;
+        Token lv_windowHeight_10_0=null;
+        Token otherlv_11=null;
+        Token lv_windowWidth_12_0=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1331:28: ( (otherlv_0= 'createWindow' otherlv_1= 'row' ( (lv_viewportRow_2_0= RULE_INT ) ) otherlv_3= 'column' ( (lv_viewportColumn_4_0= RULE_INT ) ) otherlv_5= 'height' ( (lv_viewportHeight_6_0= RULE_INT ) ) otherlv_7= 'width' ( (lv_viewportWidth_8_0= RULE_INT ) ) otherlv_9= 'windowHeight' ( (lv_windowHeight_10_0= RULE_INT ) ) otherlv_11= 'windowWidth' ( (lv_windowWidth_12_0= RULE_INT ) ) otherlv_13= '@' ( (otherlv_14= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1332:1: (otherlv_0= 'createWindow' otherlv_1= 'row' ( (lv_viewportRow_2_0= RULE_INT ) ) otherlv_3= 'column' ( (lv_viewportColumn_4_0= RULE_INT ) ) otherlv_5= 'height' ( (lv_viewportHeight_6_0= RULE_INT ) ) otherlv_7= 'width' ( (lv_viewportWidth_8_0= RULE_INT ) ) otherlv_9= 'windowHeight' ( (lv_windowHeight_10_0= RULE_INT ) ) otherlv_11= 'windowWidth' ( (lv_windowWidth_12_0= RULE_INT ) ) otherlv_13= '@' ( (otherlv_14= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1332:1: (otherlv_0= 'createWindow' otherlv_1= 'row' ( (lv_viewportRow_2_0= RULE_INT ) ) otherlv_3= 'column' ( (lv_viewportColumn_4_0= RULE_INT ) ) otherlv_5= 'height' ( (lv_viewportHeight_6_0= RULE_INT ) ) otherlv_7= 'width' ( (lv_viewportWidth_8_0= RULE_INT ) ) otherlv_9= 'windowHeight' ( (lv_windowHeight_10_0= RULE_INT ) ) otherlv_11= 'windowWidth' ( (lv_windowWidth_12_0= RULE_INT ) ) otherlv_13= '@' ( (otherlv_14= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1332:3: otherlv_0= 'createWindow' otherlv_1= 'row' ( (lv_viewportRow_2_0= RULE_INT ) ) otherlv_3= 'column' ( (lv_viewportColumn_4_0= RULE_INT ) ) otherlv_5= 'height' ( (lv_viewportHeight_6_0= RULE_INT ) ) otherlv_7= 'width' ( (lv_viewportWidth_8_0= RULE_INT ) ) otherlv_9= 'windowHeight' ( (lv_windowHeight_10_0= RULE_INT ) ) otherlv_11= 'windowWidth' ( (lv_windowWidth_12_0= RULE_INT ) ) otherlv_13= '@' ( (otherlv_14= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,37,FOLLOW_37_in_ruleStatemachineActionPeripheralCreateWindow3132); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getCreateWindowKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,38,FOLLOW_38_in_ruleStatemachineActionPeripheralCreateWindow3144); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getRowKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1340:1: ( (lv_viewportRow_2_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1341:1: (lv_viewportRow_2_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1341:1: (lv_viewportRow_2_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1342:3: lv_viewportRow_2_0= RULE_INT
+            {
+            lv_viewportRow_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralCreateWindow3161); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_viewportRow_2_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportRowINTTerminalRuleCall_2_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"viewportRow",
+                      		lv_viewportRow_2_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,39,FOLLOW_39_in_ruleStatemachineActionPeripheralCreateWindow3178); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getColumnKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1362:1: ( (lv_viewportColumn_4_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1363:1: (lv_viewportColumn_4_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1363:1: (lv_viewportColumn_4_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1364:3: lv_viewportColumn_4_0= RULE_INT
+            {
+            lv_viewportColumn_4_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralCreateWindow3195); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_viewportColumn_4_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportColumnINTTerminalRuleCall_4_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"viewportColumn",
+                      		lv_viewportColumn_4_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,40,FOLLOW_40_in_ruleStatemachineActionPeripheralCreateWindow3212); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getHeightKeyword_5());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1384:1: ( (lv_viewportHeight_6_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1385:1: (lv_viewportHeight_6_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1385:1: (lv_viewportHeight_6_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1386:3: lv_viewportHeight_6_0= RULE_INT
+            {
+            lv_viewportHeight_6_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralCreateWindow3229); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_viewportHeight_6_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportHeightINTTerminalRuleCall_6_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"viewportHeight",
+                      		lv_viewportHeight_6_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_7=(Token)match(input,41,FOLLOW_41_in_ruleStatemachineActionPeripheralCreateWindow3246); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_7, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWidthKeyword_7());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1406:1: ( (lv_viewportWidth_8_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1407:1: (lv_viewportWidth_8_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1407:1: (lv_viewportWidth_8_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1408:3: lv_viewportWidth_8_0= RULE_INT
+            {
+            lv_viewportWidth_8_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralCreateWindow3263); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_viewportWidth_8_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportWidthINTTerminalRuleCall_8_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"viewportWidth",
+                      		lv_viewportWidth_8_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_9=(Token)match(input,42,FOLLOW_42_in_ruleStatemachineActionPeripheralCreateWindow3280); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_9, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowHeightKeyword_9());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1428:1: ( (lv_windowHeight_10_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1429:1: (lv_windowHeight_10_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1429:1: (lv_windowHeight_10_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1430:3: lv_windowHeight_10_0= RULE_INT
+            {
+            lv_windowHeight_10_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralCreateWindow3297); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_windowHeight_10_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowHeightINTTerminalRuleCall_10_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"windowHeight",
+                      		lv_windowHeight_10_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_11=(Token)match(input,43,FOLLOW_43_in_ruleStatemachineActionPeripheralCreateWindow3314); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_11, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowWidthKeyword_11());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1450:1: ( (lv_windowWidth_12_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1451:1: (lv_windowWidth_12_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1451:1: (lv_windowWidth_12_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1452:3: lv_windowWidth_12_0= RULE_INT
+            {
+            lv_windowWidth_12_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralCreateWindow3331); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_windowWidth_12_0, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowWidthINTTerminalRuleCall_12_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"windowWidth",
+                      		lv_windowWidth_12_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_13=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralCreateWindow3348); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_13, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getCommercialAtKeyword_13());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1472:1: ( (otherlv_14= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1473:1: (otherlv_14= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1473:1: (otherlv_14= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1474:3: otherlv_14= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralCreateWindowRule());
+              	        }
+                      
+            }
+            otherlv_14=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralCreateWindow3368); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_14, grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_14_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralCreateWindow"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralCursorType"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1493:1: entryRuleStatemachineActionPeripheralCursorType returns [EObject current=null] : iv_ruleStatemachineActionPeripheralCursorType= ruleStatemachineActionPeripheralCursorType EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralCursorType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralCursorType = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1494:2: (iv_ruleStatemachineActionPeripheralCursorType= ruleStatemachineActionPeripheralCursorType EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1495:2: iv_ruleStatemachineActionPeripheralCursorType= ruleStatemachineActionPeripheralCursorType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralCursorTypeRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralCursorType_in_entryRuleStatemachineActionPeripheralCursorType3404);
+            iv_ruleStatemachineActionPeripheralCursorType=ruleStatemachineActionPeripheralCursorType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralCursorType; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralCursorType3414); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralCursorType"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralCursorType"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1502:1: ruleStatemachineActionPeripheralCursorType returns [EObject current=null] : (otherlv_0= 'cursorType' ( (lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralCursorType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Enumerator lv_cursorType_1_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1505:28: ( (otherlv_0= 'cursorType' ( (lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1506:1: (otherlv_0= 'cursorType' ( (lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1506:1: (otherlv_0= 'cursorType' ( (lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1506:3: otherlv_0= 'cursorType' ( (lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,44,FOLLOW_44_in_ruleStatemachineActionPeripheralCursorType3451); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getCursorTypeKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1510:1: ( (lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1511:1: (lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1511:1: (lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1512:3: lv_cursorType_1_0= ruleStatemachineLineDisplayCursorType
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getCursorTypeStatemachineLineDisplayCursorTypeEnumRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineLineDisplayCursorType_in_ruleStatemachineActionPeripheralCursorType3472);
+            lv_cursorType_1_0=ruleStatemachineLineDisplayCursorType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralCursorTypeRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"cursorType",
+                      		lv_cursorType_1_0, 
+                      		"StatemachineLineDisplayCursorType");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralCursorType3484); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getCommercialAtKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1532:1: ( (otherlv_3= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1533:1: (otherlv_3= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1533:1: (otherlv_3= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1534:3: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralCursorTypeRule());
+              	        }
+                      
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralCursorType3504); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralCursorType"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralDestroyWindow"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1553:1: entryRuleStatemachineActionPeripheralDestroyWindow returns [EObject current=null] : iv_ruleStatemachineActionPeripheralDestroyWindow= ruleStatemachineActionPeripheralDestroyWindow EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralDestroyWindow() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralDestroyWindow = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1554:2: (iv_ruleStatemachineActionPeripheralDestroyWindow= ruleStatemachineActionPeripheralDestroyWindow EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1555:2: iv_ruleStatemachineActionPeripheralDestroyWindow= ruleStatemachineActionPeripheralDestroyWindow EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralDestroyWindowRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralDestroyWindow_in_entryRuleStatemachineActionPeripheralDestroyWindow3540);
+            iv_ruleStatemachineActionPeripheralDestroyWindow=ruleStatemachineActionPeripheralDestroyWindow();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralDestroyWindow; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDestroyWindow3550); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralDestroyWindow"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralDestroyWindow"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1562:1: ruleStatemachineActionPeripheralDestroyWindow returns [EObject current=null] : (otherlv_0= 'destroyWindow' ( (otherlv_1= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralDestroyWindow() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1565:28: ( (otherlv_0= 'destroyWindow' ( (otherlv_1= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1566:1: (otherlv_0= 'destroyWindow' ( (otherlv_1= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1566:1: (otherlv_0= 'destroyWindow' ( (otherlv_1= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1566:3: otherlv_0= 'destroyWindow' ( (otherlv_1= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,45,FOLLOW_45_in_ruleStatemachineActionPeripheralDestroyWindow3587); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getDestroyWindowKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1570:1: ( (otherlv_1= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1571:1: (otherlv_1= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1571:1: (otherlv_1= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1572:3: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDestroyWindowRule());
+              	        }
+                      
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralDestroyWindow3607); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralDestroyWindow"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralDeviceBrightness"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1591:1: entryRuleStatemachineActionPeripheralDeviceBrightness returns [EObject current=null] : iv_ruleStatemachineActionPeripheralDeviceBrightness= ruleStatemachineActionPeripheralDeviceBrightness EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralDeviceBrightness() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralDeviceBrightness = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1592:2: (iv_ruleStatemachineActionPeripheralDeviceBrightness= ruleStatemachineActionPeripheralDeviceBrightness EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1593:2: iv_ruleStatemachineActionPeripheralDeviceBrightness= ruleStatemachineActionPeripheralDeviceBrightness EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralDeviceBrightness_in_entryRuleStatemachineActionPeripheralDeviceBrightness3643);
+            iv_ruleStatemachineActionPeripheralDeviceBrightness=ruleStatemachineActionPeripheralDeviceBrightness();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralDeviceBrightness; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDeviceBrightness3653); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralDeviceBrightness"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralDeviceBrightness"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1600:1: ruleStatemachineActionPeripheralDeviceBrightness returns [EObject current=null] : (otherlv_0= 'deviceBrightness' ( (lv_brightness_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralDeviceBrightness() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_brightness_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1603:28: ( (otherlv_0= 'deviceBrightness' ( (lv_brightness_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1604:1: (otherlv_0= 'deviceBrightness' ( (lv_brightness_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1604:1: (otherlv_0= 'deviceBrightness' ( (lv_brightness_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1604:3: otherlv_0= 'deviceBrightness' ( (lv_brightness_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,46,FOLLOW_46_in_ruleStatemachineActionPeripheralDeviceBrightness3690); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getDeviceBrightnessKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1608:1: ( (lv_brightness_1_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1609:1: (lv_brightness_1_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1609:1: (lv_brightness_1_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1610:3: lv_brightness_1_0= RULE_INT
+            {
+            lv_brightness_1_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralDeviceBrightness3707); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_brightness_1_0, grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getBrightnessINTTerminalRuleCall_1_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"brightness",
+                      		lv_brightness_1_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralDeviceBrightness3724); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getCommercialAtKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1630:1: ( (otherlv_3= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1631:1: (otherlv_3= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1631:1: (otherlv_3= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1632:3: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule());
+              	        }
+                      
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralDeviceBrightness3744); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralDeviceBrightness"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralDisplayBitmap"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1651:1: entryRuleStatemachineActionPeripheralDisplayBitmap returns [EObject current=null] : iv_ruleStatemachineActionPeripheralDisplayBitmap= ruleStatemachineActionPeripheralDisplayBitmap EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralDisplayBitmap() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralDisplayBitmap = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1652:2: (iv_ruleStatemachineActionPeripheralDisplayBitmap= ruleStatemachineActionPeripheralDisplayBitmap EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1653:2: iv_ruleStatemachineActionPeripheralDisplayBitmap= ruleStatemachineActionPeripheralDisplayBitmap EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralDisplayBitmap_in_entryRuleStatemachineActionPeripheralDisplayBitmap3780);
+            iv_ruleStatemachineActionPeripheralDisplayBitmap=ruleStatemachineActionPeripheralDisplayBitmap();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralDisplayBitmap; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDisplayBitmap3790); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralDisplayBitmap"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralDisplayBitmap"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1660:1: ruleStatemachineActionPeripheralDisplayBitmap returns [EObject current=null] : (otherlv_0= 'displayBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralDisplayBitmap() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_bitmapId_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1663:28: ( (otherlv_0= 'displayBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1664:1: (otherlv_0= 'displayBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1664:1: (otherlv_0= 'displayBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1664:3: otherlv_0= 'displayBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,47,FOLLOW_47_in_ruleStatemachineActionPeripheralDisplayBitmap3827); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getDisplayBitmapKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,48,FOLLOW_48_in_ruleStatemachineActionPeripheralDisplayBitmap3839); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getIdKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1672:1: ( (lv_bitmapId_2_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1673:1: (lv_bitmapId_2_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1673:1: (lv_bitmapId_2_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1674:3: lv_bitmapId_2_0= RULE_INT
+            {
+            lv_bitmapId_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralDisplayBitmap3856); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_bitmapId_2_0, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"bitmapId",
+                      		lv_bitmapId_2_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralDisplayBitmap3873); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getCommercialAtKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1694:1: ( (otherlv_4= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1695:1: (otherlv_4= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1695:1: (otherlv_4= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1696:3: otherlv_4= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule());
+              	        }
+                      
+            }
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralDisplayBitmap3893); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralDisplayBitmap"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralDisplayText"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1715:1: entryRuleStatemachineActionPeripheralDisplayText returns [EObject current=null] : iv_ruleStatemachineActionPeripheralDisplayText= ruleStatemachineActionPeripheralDisplayText EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralDisplayText() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralDisplayText = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1716:2: (iv_ruleStatemachineActionPeripheralDisplayText= ruleStatemachineActionPeripheralDisplayText EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1717:2: iv_ruleStatemachineActionPeripheralDisplayText= ruleStatemachineActionPeripheralDisplayText EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralDisplayText_in_entryRuleStatemachineActionPeripheralDisplayText3929);
+            iv_ruleStatemachineActionPeripheralDisplayText=ruleStatemachineActionPeripheralDisplayText();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralDisplayText; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDisplayText3939); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralDisplayText"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralDisplayText"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1724:1: ruleStatemachineActionPeripheralDisplayText returns [EObject current=null] : (otherlv_0= 'displayText' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) ( ( (lv_hasType_3_0= 'type' ) ) ( (lv_textType_4_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralDisplayText() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_hasType_3_0=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        EObject lv_text_2_0 = null;
+
+        Enumerator lv_textType_4_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1727:28: ( (otherlv_0= 'displayText' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) ( ( (lv_hasType_3_0= 'type' ) ) ( (lv_textType_4_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1728:1: (otherlv_0= 'displayText' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) ( ( (lv_hasType_3_0= 'type' ) ) ( (lv_textType_4_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1728:1: (otherlv_0= 'displayText' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) ( ( (lv_hasType_3_0= 'type' ) ) ( (lv_textType_4_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1728:3: otherlv_0= 'displayText' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) ( ( (lv_hasType_3_0= 'type' ) ) ( (lv_textType_4_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_5= '@' ( (otherlv_6= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,49,FOLLOW_49_in_ruleStatemachineActionPeripheralDisplayText3976); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getDisplayTextKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,50,FOLLOW_50_in_ruleStatemachineActionPeripheralDisplayText3988); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getTextKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1736:1: ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1737:1: (lv_text_2_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1737:1: (lv_text_2_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1738:3: lv_text_2_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralDisplayText4009);
+            lv_text_2_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralDisplayTextRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"text",
+                      		lv_text_2_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1754:2: ( ( (lv_hasType_3_0= 'type' ) ) ( (lv_textType_4_0= ruleStatemachineLineDisplayTextType ) ) )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0==51) ) {
+                alt19=1;
+            }
+            switch (alt19) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1754:3: ( (lv_hasType_3_0= 'type' ) ) ( (lv_textType_4_0= ruleStatemachineLineDisplayTextType ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1754:3: ( (lv_hasType_3_0= 'type' ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1755:1: (lv_hasType_3_0= 'type' )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1755:1: (lv_hasType_3_0= 'type' )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1756:3: lv_hasType_3_0= 'type'
+                    {
+                    lv_hasType_3_0=(Token)match(input,51,FOLLOW_51_in_ruleStatemachineActionPeripheralDisplayText4028); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              newLeafNode(lv_hasType_3_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getHasTypeTypeKeyword_3_0_0());
+                          
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextRule());
+                      	        }
+                             		setWithLastConsumed(current, "hasType", true, "type");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1769:2: ( (lv_textType_4_0= ruleStatemachineLineDisplayTextType ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1770:1: (lv_textType_4_0= ruleStatemachineLineDisplayTextType )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1770:1: (lv_textType_4_0= ruleStatemachineLineDisplayTextType )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1771:3: lv_textType_4_0= ruleStatemachineLineDisplayTextType
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_3_1_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineLineDisplayTextType_in_ruleStatemachineActionPeripheralDisplayText4062);
+                    lv_textType_4_0=ruleStatemachineLineDisplayTextType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralDisplayTextRule());
+                      	        }
+                             		set(
+                             			current, 
+                             			"textType",
+                              		lv_textType_4_0, 
+                              		"StatemachineLineDisplayTextType");
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralDisplayText4076); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getCommercialAtKeyword_4());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1791:1: ( (otherlv_6= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1792:1: (otherlv_6= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1792:1: (otherlv_6= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1793:3: otherlv_6= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextRule());
+              	        }
+                      
+            }
+            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralDisplayText4096); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_5_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralDisplayText"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralDisplayTextAt"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1812:1: entryRuleStatemachineActionPeripheralDisplayTextAt returns [EObject current=null] : iv_ruleStatemachineActionPeripheralDisplayTextAt= ruleStatemachineActionPeripheralDisplayTextAt EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralDisplayTextAt() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralDisplayTextAt = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1813:2: (iv_ruleStatemachineActionPeripheralDisplayTextAt= ruleStatemachineActionPeripheralDisplayTextAt EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1814:2: iv_ruleStatemachineActionPeripheralDisplayTextAt= ruleStatemachineActionPeripheralDisplayTextAt EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralDisplayTextAt_in_entryRuleStatemachineActionPeripheralDisplayTextAt4132);
+            iv_ruleStatemachineActionPeripheralDisplayTextAt=ruleStatemachineActionPeripheralDisplayTextAt();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralDisplayTextAt; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralDisplayTextAt4142); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralDisplayTextAt"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralDisplayTextAt"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1821:1: ruleStatemachineActionPeripheralDisplayTextAt returns [EObject current=null] : (otherlv_0= 'displayTextAt' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'row' ( (lv_row_4_0= RULE_INT ) ) otherlv_5= 'column' ( (lv_column_6_0= RULE_INT ) ) ( ( (lv_hasType_7_0= 'type' ) ) ( (lv_textType_8_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_9= '@' ( (otherlv_10= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralDisplayTextAt() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token lv_row_4_0=null;
+        Token otherlv_5=null;
+        Token lv_column_6_0=null;
+        Token lv_hasType_7_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        EObject lv_text_2_0 = null;
+
+        Enumerator lv_textType_8_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1824:28: ( (otherlv_0= 'displayTextAt' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'row' ( (lv_row_4_0= RULE_INT ) ) otherlv_5= 'column' ( (lv_column_6_0= RULE_INT ) ) ( ( (lv_hasType_7_0= 'type' ) ) ( (lv_textType_8_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_9= '@' ( (otherlv_10= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1825:1: (otherlv_0= 'displayTextAt' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'row' ( (lv_row_4_0= RULE_INT ) ) otherlv_5= 'column' ( (lv_column_6_0= RULE_INT ) ) ( ( (lv_hasType_7_0= 'type' ) ) ( (lv_textType_8_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_9= '@' ( (otherlv_10= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1825:1: (otherlv_0= 'displayTextAt' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'row' ( (lv_row_4_0= RULE_INT ) ) otherlv_5= 'column' ( (lv_column_6_0= RULE_INT ) ) ( ( (lv_hasType_7_0= 'type' ) ) ( (lv_textType_8_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_9= '@' ( (otherlv_10= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1825:3: otherlv_0= 'displayTextAt' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'row' ( (lv_row_4_0= RULE_INT ) ) otherlv_5= 'column' ( (lv_column_6_0= RULE_INT ) ) ( ( (lv_hasType_7_0= 'type' ) ) ( (lv_textType_8_0= ruleStatemachineLineDisplayTextType ) ) )? otherlv_9= '@' ( (otherlv_10= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,52,FOLLOW_52_in_ruleStatemachineActionPeripheralDisplayTextAt4179); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getDisplayTextAtKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,50,FOLLOW_50_in_ruleStatemachineActionPeripheralDisplayTextAt4191); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getTextKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1833:1: ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1834:1: (lv_text_2_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1834:1: (lv_text_2_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1835:3: lv_text_2_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralDisplayTextAt4212);
+            lv_text_2_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"text",
+                      		lv_text_2_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,38,FOLLOW_38_in_ruleStatemachineActionPeripheralDisplayTextAt4224); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getRowKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1855:1: ( (lv_row_4_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1856:1: (lv_row_4_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1856:1: (lv_row_4_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1857:3: lv_row_4_0= RULE_INT
+            {
+            lv_row_4_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralDisplayTextAt4241); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_row_4_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getRowINTTerminalRuleCall_4_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"row",
+                      		lv_row_4_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,39,FOLLOW_39_in_ruleStatemachineActionPeripheralDisplayTextAt4258); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getColumnKeyword_5());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1877:1: ( (lv_column_6_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1878:1: (lv_column_6_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1878:1: (lv_column_6_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1879:3: lv_column_6_0= RULE_INT
+            {
+            lv_column_6_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralDisplayTextAt4275); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_column_6_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getColumnINTTerminalRuleCall_6_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"column",
+                      		lv_column_6_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1895:2: ( ( (lv_hasType_7_0= 'type' ) ) ( (lv_textType_8_0= ruleStatemachineLineDisplayTextType ) ) )?
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+
+            if ( (LA20_0==51) ) {
+                alt20=1;
+            }
+            switch (alt20) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1895:3: ( (lv_hasType_7_0= 'type' ) ) ( (lv_textType_8_0= ruleStatemachineLineDisplayTextType ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1895:3: ( (lv_hasType_7_0= 'type' ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1896:1: (lv_hasType_7_0= 'type' )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1896:1: (lv_hasType_7_0= 'type' )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1897:3: lv_hasType_7_0= 'type'
+                    {
+                    lv_hasType_7_0=(Token)match(input,51,FOLLOW_51_in_ruleStatemachineActionPeripheralDisplayTextAt4299); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              newLeafNode(lv_hasType_7_0, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getHasTypeTypeKeyword_7_0_0());
+                          
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+                      	        }
+                             		setWithLastConsumed(current, "hasType", true, "type");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1910:2: ( (lv_textType_8_0= ruleStatemachineLineDisplayTextType ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1911:1: (lv_textType_8_0= ruleStatemachineLineDisplayTextType )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1911:1: (lv_textType_8_0= ruleStatemachineLineDisplayTextType )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1912:3: lv_textType_8_0= ruleStatemachineLineDisplayTextType
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_7_1_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineLineDisplayTextType_in_ruleStatemachineActionPeripheralDisplayTextAt4333);
+                    lv_textType_8_0=ruleStatemachineLineDisplayTextType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+                      	        }
+                             		set(
+                             			current, 
+                             			"textType",
+                              		lv_textType_8_0, 
+                              		"StatemachineLineDisplayTextType");
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralDisplayTextAt4347); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_9, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getCommercialAtKeyword_8());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1932:1: ( (otherlv_10= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1933:1: (otherlv_10= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1933:1: (otherlv_10= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1934:3: otherlv_10= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule());
+              	        }
+                      
+            }
+            otherlv_10=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralDisplayTextAt4367); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_10, grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_9_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralDisplayTextAt"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralInterCharacterWait"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1953:1: entryRuleStatemachineActionPeripheralInterCharacterWait returns [EObject current=null] : iv_ruleStatemachineActionPeripheralInterCharacterWait= ruleStatemachineActionPeripheralInterCharacterWait EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralInterCharacterWait() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralInterCharacterWait = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1954:2: (iv_ruleStatemachineActionPeripheralInterCharacterWait= ruleStatemachineActionPeripheralInterCharacterWait EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1955:2: iv_ruleStatemachineActionPeripheralInterCharacterWait= ruleStatemachineActionPeripheralInterCharacterWait EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralInterCharacterWait_in_entryRuleStatemachineActionPeripheralInterCharacterWait4403);
+            iv_ruleStatemachineActionPeripheralInterCharacterWait=ruleStatemachineActionPeripheralInterCharacterWait();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralInterCharacterWait; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralInterCharacterWait4413); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralInterCharacterWait"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralInterCharacterWait"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1962:1: ruleStatemachineActionPeripheralInterCharacterWait returns [EObject current=null] : (otherlv_0= 'interCharacterWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralInterCharacterWait() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_wait_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1965:28: ( (otherlv_0= 'interCharacterWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1966:1: (otherlv_0= 'interCharacterWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1966:1: (otherlv_0= 'interCharacterWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1966:3: otherlv_0= 'interCharacterWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,53,FOLLOW_53_in_ruleStatemachineActionPeripheralInterCharacterWait4450); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getInterCharacterWaitKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1970:1: ( (lv_wait_1_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1971:1: (lv_wait_1_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1971:1: (lv_wait_1_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1972:3: lv_wait_1_0= RULE_INT
+            {
+            lv_wait_1_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralInterCharacterWait4467); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_wait_1_0, grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getWaitINTTerminalRuleCall_1_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"wait",
+                      		lv_wait_1_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralInterCharacterWait4484); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getCommercialAtKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1992:1: ( (otherlv_3= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1993:1: (otherlv_3= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1993:1: (otherlv_3= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:1994:3: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule());
+              	        }
+                      
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralInterCharacterWait4504); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralInterCharacterWait"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralMarqueeFormat"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2013:1: entryRuleStatemachineActionPeripheralMarqueeFormat returns [EObject current=null] : iv_ruleStatemachineActionPeripheralMarqueeFormat= ruleStatemachineActionPeripheralMarqueeFormat EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralMarqueeFormat() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralMarqueeFormat = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2014:2: (iv_ruleStatemachineActionPeripheralMarqueeFormat= ruleStatemachineActionPeripheralMarqueeFormat EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2015:2: iv_ruleStatemachineActionPeripheralMarqueeFormat= ruleStatemachineActionPeripheralMarqueeFormat EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralMarqueeFormat_in_entryRuleStatemachineActionPeripheralMarqueeFormat4540);
+            iv_ruleStatemachineActionPeripheralMarqueeFormat=ruleStatemachineActionPeripheralMarqueeFormat();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralMarqueeFormat; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralMarqueeFormat4550); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralMarqueeFormat"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralMarqueeFormat"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2022:1: ruleStatemachineActionPeripheralMarqueeFormat returns [EObject current=null] : (otherlv_0= 'marqueeFormat' ( (lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralMarqueeFormat() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Enumerator lv_format_1_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2025:28: ( (otherlv_0= 'marqueeFormat' ( (lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2026:1: (otherlv_0= 'marqueeFormat' ( (lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2026:1: (otherlv_0= 'marqueeFormat' ( (lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2026:3: otherlv_0= 'marqueeFormat' ( (lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,54,FOLLOW_54_in_ruleStatemachineActionPeripheralMarqueeFormat4587); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getMarqueeFormatKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2030:1: ( (lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2031:1: (lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2031:1: (lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2032:3: lv_format_1_0= ruleStatemachineLineDisplayMarqueeFormat
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getFormatStatemachineLineDisplayMarqueeFormatEnumRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineLineDisplayMarqueeFormat_in_ruleStatemachineActionPeripheralMarqueeFormat4608);
+            lv_format_1_0=ruleStatemachineLineDisplayMarqueeFormat();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"format",
+                      		lv_format_1_0, 
+                      		"StatemachineLineDisplayMarqueeFormat");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralMarqueeFormat4620); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getCommercialAtKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2052:1: ( (otherlv_3= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2053:1: (otherlv_3= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2053:1: (otherlv_3= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2054:3: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule());
+              	        }
+                      
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralMarqueeFormat4640); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralMarqueeFormat"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralMarqueeRepeatWait"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2073:1: entryRuleStatemachineActionPeripheralMarqueeRepeatWait returns [EObject current=null] : iv_ruleStatemachineActionPeripheralMarqueeRepeatWait= ruleStatemachineActionPeripheralMarqueeRepeatWait EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralMarqueeRepeatWait() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralMarqueeRepeatWait = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2074:2: (iv_ruleStatemachineActionPeripheralMarqueeRepeatWait= ruleStatemachineActionPeripheralMarqueeRepeatWait EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2075:2: iv_ruleStatemachineActionPeripheralMarqueeRepeatWait= ruleStatemachineActionPeripheralMarqueeRepeatWait EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralMarqueeRepeatWait_in_entryRuleStatemachineActionPeripheralMarqueeRepeatWait4676);
+            iv_ruleStatemachineActionPeripheralMarqueeRepeatWait=ruleStatemachineActionPeripheralMarqueeRepeatWait();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralMarqueeRepeatWait; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralMarqueeRepeatWait4686); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralMarqueeRepeatWait"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralMarqueeRepeatWait"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2082:1: ruleStatemachineActionPeripheralMarqueeRepeatWait returns [EObject current=null] : (otherlv_0= 'marqueeRepeatWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralMarqueeRepeatWait() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_wait_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2085:28: ( (otherlv_0= 'marqueeRepeatWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2086:1: (otherlv_0= 'marqueeRepeatWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2086:1: (otherlv_0= 'marqueeRepeatWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2086:3: otherlv_0= 'marqueeRepeatWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,55,FOLLOW_55_in_ruleStatemachineActionPeripheralMarqueeRepeatWait4723); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getMarqueeRepeatWaitKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2090:1: ( (lv_wait_1_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2091:1: (lv_wait_1_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2091:1: (lv_wait_1_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2092:3: lv_wait_1_0= RULE_INT
+            {
+            lv_wait_1_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralMarqueeRepeatWait4740); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_wait_1_0, grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getWaitINTTerminalRuleCall_1_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"wait",
+                      		lv_wait_1_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralMarqueeRepeatWait4757); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getCommercialAtKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2112:1: ( (otherlv_3= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2113:1: (otherlv_3= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2113:1: (otherlv_3= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2114:3: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule());
+              	        }
+                      
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralMarqueeRepeatWait4777); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralMarqueeRepeatWait"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralMarqueeType"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2133:1: entryRuleStatemachineActionPeripheralMarqueeType returns [EObject current=null] : iv_ruleStatemachineActionPeripheralMarqueeType= ruleStatemachineActionPeripheralMarqueeType EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralMarqueeType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralMarqueeType = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2134:2: (iv_ruleStatemachineActionPeripheralMarqueeType= ruleStatemachineActionPeripheralMarqueeType EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2135:2: iv_ruleStatemachineActionPeripheralMarqueeType= ruleStatemachineActionPeripheralMarqueeType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralMarqueeType_in_entryRuleStatemachineActionPeripheralMarqueeType4813);
+            iv_ruleStatemachineActionPeripheralMarqueeType=ruleStatemachineActionPeripheralMarqueeType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralMarqueeType; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralMarqueeType4823); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralMarqueeType"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralMarqueeType"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2142:1: ruleStatemachineActionPeripheralMarqueeType returns [EObject current=null] : (otherlv_0= 'marqueeType' ( (lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralMarqueeType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Enumerator lv_marqueeType_1_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2145:28: ( (otherlv_0= 'marqueeType' ( (lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2146:1: (otherlv_0= 'marqueeType' ( (lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2146:1: (otherlv_0= 'marqueeType' ( (lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2146:3: otherlv_0= 'marqueeType' ( (lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,56,FOLLOW_56_in_ruleStatemachineActionPeripheralMarqueeType4860); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getMarqueeTypeKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2150:1: ( (lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2151:1: (lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2151:1: (lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2152:3: lv_marqueeType_1_0= ruleStatemachineLineDisplayMarqueeType
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getMarqueeTypeStatemachineLineDisplayMarqueeTypeEnumRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineLineDisplayMarqueeType_in_ruleStatemachineActionPeripheralMarqueeType4881);
+            lv_marqueeType_1_0=ruleStatemachineLineDisplayMarqueeType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"marqueeType",
+                      		lv_marqueeType_1_0, 
+                      		"StatemachineLineDisplayMarqueeType");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralMarqueeType4893); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getCommercialAtKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2172:1: ( (otherlv_3= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2173:1: (otherlv_3= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2173:1: (otherlv_3= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2174:3: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule());
+              	        }
+                      
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralMarqueeType4913); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralMarqueeType"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralMarqueeUnitWait"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2193:1: entryRuleStatemachineActionPeripheralMarqueeUnitWait returns [EObject current=null] : iv_ruleStatemachineActionPeripheralMarqueeUnitWait= ruleStatemachineActionPeripheralMarqueeUnitWait EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralMarqueeUnitWait() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralMarqueeUnitWait = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2194:2: (iv_ruleStatemachineActionPeripheralMarqueeUnitWait= ruleStatemachineActionPeripheralMarqueeUnitWait EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2195:2: iv_ruleStatemachineActionPeripheralMarqueeUnitWait= ruleStatemachineActionPeripheralMarqueeUnitWait EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralMarqueeUnitWait_in_entryRuleStatemachineActionPeripheralMarqueeUnitWait4949);
+            iv_ruleStatemachineActionPeripheralMarqueeUnitWait=ruleStatemachineActionPeripheralMarqueeUnitWait();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralMarqueeUnitWait; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralMarqueeUnitWait4959); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralMarqueeUnitWait"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralMarqueeUnitWait"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2202:1: ruleStatemachineActionPeripheralMarqueeUnitWait returns [EObject current=null] : (otherlv_0= 'marqueeUnitWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralMarqueeUnitWait() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_wait_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2205:28: ( (otherlv_0= 'marqueeUnitWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2206:1: (otherlv_0= 'marqueeUnitWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2206:1: (otherlv_0= 'marqueeUnitWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2206:3: otherlv_0= 'marqueeUnitWait' ( (lv_wait_1_0= RULE_INT ) ) otherlv_2= '@' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,57,FOLLOW_57_in_ruleStatemachineActionPeripheralMarqueeUnitWait4996); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getMarqueeUnitWaitKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2210:1: ( (lv_wait_1_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2211:1: (lv_wait_1_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2211:1: (lv_wait_1_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2212:3: lv_wait_1_0= RULE_INT
+            {
+            lv_wait_1_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralMarqueeUnitWait5013); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_wait_1_0, grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getWaitINTTerminalRuleCall_1_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"wait",
+                      		lv_wait_1_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralMarqueeUnitWait5030); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getCommercialAtKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2232:1: ( (otherlv_3= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2233:1: (otherlv_3= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2233:1: (otherlv_3= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2234:3: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule());
+              	        }
+                      
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralMarqueeUnitWait5050); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralMarqueeUnitWait"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralScroll"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2253:1: entryRuleStatemachineActionPeripheralScroll returns [EObject current=null] : iv_ruleStatemachineActionPeripheralScroll= ruleStatemachineActionPeripheralScroll EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralScroll() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralScroll = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2254:2: (iv_ruleStatemachineActionPeripheralScroll= ruleStatemachineActionPeripheralScroll EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2255:2: iv_ruleStatemachineActionPeripheralScroll= ruleStatemachineActionPeripheralScroll EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralScrollRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralScroll_in_entryRuleStatemachineActionPeripheralScroll5086);
+            iv_ruleStatemachineActionPeripheralScroll=ruleStatemachineActionPeripheralScroll();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralScroll; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralScroll5096); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralScroll"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralScroll"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2262:1: ruleStatemachineActionPeripheralScroll returns [EObject current=null] : (otherlv_0= 'scroll' ( (lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType ) ) ( (lv_units_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralScroll() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_units_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Enumerator lv_direction_1_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2265:28: ( (otherlv_0= 'scroll' ( (lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType ) ) ( (lv_units_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2266:1: (otherlv_0= 'scroll' ( (lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType ) ) ( (lv_units_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2266:1: (otherlv_0= 'scroll' ( (lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType ) ) ( (lv_units_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2266:3: otherlv_0= 'scroll' ( (lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType ) ) ( (lv_units_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,58,FOLLOW_58_in_ruleStatemachineActionPeripheralScroll5133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralScrollAccess().getScrollKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2270:1: ( (lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2271:1: (lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2271:1: (lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2272:3: lv_direction_1_0= ruleStatemachineLineDisplayScrollTextType
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralScrollAccess().getDirectionStatemachineLineDisplayScrollTextTypeEnumRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineLineDisplayScrollTextType_in_ruleStatemachineActionPeripheralScroll5154);
+            lv_direction_1_0=ruleStatemachineLineDisplayScrollTextType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralScrollRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"direction",
+                      		lv_direction_1_0, 
+                      		"StatemachineLineDisplayScrollTextType");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2288:2: ( (lv_units_2_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2289:1: (lv_units_2_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2289:1: (lv_units_2_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2290:3: lv_units_2_0= RULE_INT
+            {
+            lv_units_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralScroll5171); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_units_2_0, grammarAccess.getStatemachineActionPeripheralScrollAccess().getUnitsINTTerminalRuleCall_2_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralScrollRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"units",
+                      		lv_units_2_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralScroll5188); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralScrollAccess().getCommercialAtKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2310:1: ( (otherlv_4= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2311:1: (otherlv_4= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2311:1: (otherlv_4= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2312:3: otherlv_4= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralScrollRule());
+              	        }
+                      
+            }
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralScroll5208); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralScrollAccess().getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralScroll"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralOpenDrawer"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2331:1: entryRuleStatemachineActionPeripheralOpenDrawer returns [EObject current=null] : iv_ruleStatemachineActionPeripheralOpenDrawer= ruleStatemachineActionPeripheralOpenDrawer EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralOpenDrawer() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralOpenDrawer = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2332:2: (iv_ruleStatemachineActionPeripheralOpenDrawer= ruleStatemachineActionPeripheralOpenDrawer EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2333:2: iv_ruleStatemachineActionPeripheralOpenDrawer= ruleStatemachineActionPeripheralOpenDrawer EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralOpenDrawerRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralOpenDrawer_in_entryRuleStatemachineActionPeripheralOpenDrawer5244);
+            iv_ruleStatemachineActionPeripheralOpenDrawer=ruleStatemachineActionPeripheralOpenDrawer();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralOpenDrawer; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralOpenDrawer5254); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralOpenDrawer"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralOpenDrawer"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2340:1: ruleStatemachineActionPeripheralOpenDrawer returns [EObject current=null] : (otherlv_0= 'openDrawer' ( (otherlv_1= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralOpenDrawer() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2343:28: ( (otherlv_0= 'openDrawer' ( (otherlv_1= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2344:1: (otherlv_0= 'openDrawer' ( (otherlv_1= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2344:1: (otherlv_0= 'openDrawer' ( (otherlv_1= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2344:3: otherlv_0= 'openDrawer' ( (otherlv_1= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,59,FOLLOW_59_in_ruleStatemachineActionPeripheralOpenDrawer5291); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getOpenDrawerKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2348:1: ( (otherlv_1= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2349:1: (otherlv_1= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2349:1: (otherlv_1= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2350:3: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralOpenDrawerRule());
+              	        }
+                      
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralOpenDrawer5311); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getDeviceStatemachinePeripheralDeviceCashDrawerCrossReference_1_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralOpenDrawer"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPrintBarcode"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2369:1: entryRuleStatemachineActionPeripheralPrintBarcode returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPrintBarcode= ruleStatemachineActionPeripheralPrintBarcode EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPrintBarcode() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPrintBarcode = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2370:2: (iv_ruleStatemachineActionPeripheralPrintBarcode= ruleStatemachineActionPeripheralPrintBarcode EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2371:2: iv_ruleStatemachineActionPeripheralPrintBarcode= ruleStatemachineActionPeripheralPrintBarcode EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintBarcode_in_entryRuleStatemachineActionPeripheralPrintBarcode5347);
+            iv_ruleStatemachineActionPeripheralPrintBarcode=ruleStatemachineActionPeripheralPrintBarcode();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPrintBarcode; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintBarcode5357); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPrintBarcode"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPrintBarcode"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2378:1: ruleStatemachineActionPeripheralPrintBarcode returns [EObject current=null] : (otherlv_0= 'printBarcode' otherlv_1= 'data' ( (lv_data_2_0= RULE_STRING ) ) otherlv_3= 'barcodeType' ( (lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPrintBarcode() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_data_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Enumerator lv_barcodeType_4_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2381:28: ( (otherlv_0= 'printBarcode' otherlv_1= 'data' ( (lv_data_2_0= RULE_STRING ) ) otherlv_3= 'barcodeType' ( (lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2382:1: (otherlv_0= 'printBarcode' otherlv_1= 'data' ( (lv_data_2_0= RULE_STRING ) ) otherlv_3= 'barcodeType' ( (lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2382:1: (otherlv_0= 'printBarcode' otherlv_1= 'data' ( (lv_data_2_0= RULE_STRING ) ) otherlv_3= 'barcodeType' ( (lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2382:3: otherlv_0= 'printBarcode' otherlv_1= 'data' ( (lv_data_2_0= RULE_STRING ) ) otherlv_3= 'barcodeType' ( (lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,60,FOLLOW_60_in_ruleStatemachineActionPeripheralPrintBarcode5394); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getPrintBarcodeKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,61,FOLLOW_61_in_ruleStatemachineActionPeripheralPrintBarcode5406); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDataKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2390:1: ( (lv_data_2_0= RULE_STRING ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2391:1: (lv_data_2_0= RULE_STRING )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2391:1: (lv_data_2_0= RULE_STRING )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2392:3: lv_data_2_0= RULE_STRING
+            {
+            lv_data_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleStatemachineActionPeripheralPrintBarcode5423); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_data_2_0, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDataSTRINGTerminalRuleCall_2_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"data",
+                      		lv_data_2_0, 
+                      		"STRING");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,62,FOLLOW_62_in_ruleStatemachineActionPeripheralPrintBarcode5440); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getBarcodeTypeKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2412:1: ( (lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2413:1: (lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2413:1: (lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2414:3: lv_barcodeType_4_0= ruleStatemachinePOSPrinterBarcodeType
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getBarcodeTypeStatemachinePOSPrinterBarcodeTypeEnumRuleCall_4_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachinePOSPrinterBarcodeType_in_ruleStatemachineActionPeripheralPrintBarcode5461);
+            lv_barcodeType_4_0=ruleStatemachinePOSPrinterBarcodeType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"barcodeType",
+                      		lv_barcodeType_4_0, 
+                      		"StatemachinePOSPrinterBarcodeType");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPrintBarcode5473); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getCommercialAtKeyword_5());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2434:1: ( (otherlv_6= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2435:1: (otherlv_6= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2435:1: (otherlv_6= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2436:3: otherlv_6= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule());
+              	        }
+                      
+            }
+            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPrintBarcode5493); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPrintBarcode"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPrintBitmap"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2455:1: entryRuleStatemachineActionPeripheralPrintBitmap returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPrintBitmap= ruleStatemachineActionPeripheralPrintBitmap EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPrintBitmap() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPrintBitmap = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2456:2: (iv_ruleStatemachineActionPeripheralPrintBitmap= ruleStatemachineActionPeripheralPrintBitmap EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2457:2: iv_ruleStatemachineActionPeripheralPrintBitmap= ruleStatemachineActionPeripheralPrintBitmap EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintBitmap_in_entryRuleStatemachineActionPeripheralPrintBitmap5529);
+            iv_ruleStatemachineActionPeripheralPrintBitmap=ruleStatemachineActionPeripheralPrintBitmap();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPrintBitmap; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintBitmap5539); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPrintBitmap"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPrintBitmap"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2464:1: ruleStatemachineActionPeripheralPrintBitmap returns [EObject current=null] : (otherlv_0= 'printBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPrintBitmap() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_bitmapId_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2467:28: ( (otherlv_0= 'printBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2468:1: (otherlv_0= 'printBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2468:1: (otherlv_0= 'printBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2468:3: otherlv_0= 'printBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,63,FOLLOW_63_in_ruleStatemachineActionPeripheralPrintBitmap5576); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getPrintBitmapKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,48,FOLLOW_48_in_ruleStatemachineActionPeripheralPrintBitmap5588); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getIdKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2476:1: ( (lv_bitmapId_2_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2477:1: (lv_bitmapId_2_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2477:1: (lv_bitmapId_2_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2478:3: lv_bitmapId_2_0= RULE_INT
+            {
+            lv_bitmapId_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralPrintBitmap5605); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_bitmapId_2_0, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"bitmapId",
+                      		lv_bitmapId_2_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPrintBitmap5622); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getCommercialAtKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2498:1: ( (otherlv_4= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2499:1: (otherlv_4= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2499:1: (otherlv_4= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2500:3: otherlv_4= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule());
+              	        }
+                      
+            }
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPrintBitmap5642); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPrintBitmap"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPrintCut"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2519:1: entryRuleStatemachineActionPeripheralPrintCut returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPrintCut= ruleStatemachineActionPeripheralPrintCut EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPrintCut() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPrintCut = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2520:2: (iv_ruleStatemachineActionPeripheralPrintCut= ruleStatemachineActionPeripheralPrintCut EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2521:2: iv_ruleStatemachineActionPeripheralPrintCut= ruleStatemachineActionPeripheralPrintCut EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintCutRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintCut_in_entryRuleStatemachineActionPeripheralPrintCut5678);
+            iv_ruleStatemachineActionPeripheralPrintCut=ruleStatemachineActionPeripheralPrintCut();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPrintCut; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintCut5688); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPrintCut"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPrintCut"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2528:1: ruleStatemachineActionPeripheralPrintCut returns [EObject current=null] : (otherlv_0= 'printCut' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPrintCut() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        EObject lv_text_2_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2531:28: ( (otherlv_0= 'printCut' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2532:1: (otherlv_0= 'printCut' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2532:1: (otherlv_0= 'printCut' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2532:3: otherlv_0= 'printCut' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,64,FOLLOW_64_in_ruleStatemachineActionPeripheralPrintCut5725); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getPrintCutKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,50,FOLLOW_50_in_ruleStatemachineActionPeripheralPrintCut5737); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getTextKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2540:1: ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2541:1: (lv_text_2_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2541:1: (lv_text_2_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2542:3: lv_text_2_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralPrintCut5758);
+            lv_text_2_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPrintCutRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"text",
+                      		lv_text_2_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPrintCut5770); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getCommercialAtKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2562:1: ( (otherlv_4= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2563:1: (otherlv_4= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2563:1: (otherlv_4= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2564:3: otherlv_4= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintCutRule());
+              	        }
+                      
+            }
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPrintCut5790); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPrintCut"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPrintNormal"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2583:1: entryRuleStatemachineActionPeripheralPrintNormal returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPrintNormal= ruleStatemachineActionPeripheralPrintNormal EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPrintNormal() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPrintNormal = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2584:2: (iv_ruleStatemachineActionPeripheralPrintNormal= ruleStatemachineActionPeripheralPrintNormal EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2585:2: iv_ruleStatemachineActionPeripheralPrintNormal= ruleStatemachineActionPeripheralPrintNormal EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintNormalRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintNormal_in_entryRuleStatemachineActionPeripheralPrintNormal5826);
+            iv_ruleStatemachineActionPeripheralPrintNormal=ruleStatemachineActionPeripheralPrintNormal();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPrintNormal; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintNormal5836); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPrintNormal"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPrintNormal"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2592:1: ruleStatemachineActionPeripheralPrintNormal returns [EObject current=null] : (otherlv_0= 'printNormal' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPrintNormal() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        EObject lv_text_2_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2595:28: ( (otherlv_0= 'printNormal' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2596:1: (otherlv_0= 'printNormal' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2596:1: (otherlv_0= 'printNormal' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2596:3: otherlv_0= 'printNormal' otherlv_1= 'text' ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,65,FOLLOW_65_in_ruleStatemachineActionPeripheralPrintNormal5873); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getPrintNormalKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,50,FOLLOW_50_in_ruleStatemachineActionPeripheralPrintNormal5885); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getTextKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2604:1: ( (lv_text_2_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2605:1: (lv_text_2_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2605:1: (lv_text_2_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2606:3: lv_text_2_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralPrintNormal5906);
+            lv_text_2_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPrintNormalRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"text",
+                      		lv_text_2_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPrintNormal5918); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getCommercialAtKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2626:1: ( (otherlv_4= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2627:1: (otherlv_4= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2627:1: (otherlv_4= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2628:3: otherlv_4= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintNormalRule());
+              	        }
+                      
+            }
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPrintNormal5938); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPrintNormal"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPrintRegisterBitmap"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2647:1: entryRuleStatemachineActionPeripheralPrintRegisterBitmap returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPrintRegisterBitmap= ruleStatemachineActionPeripheralPrintRegisterBitmap EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPrintRegisterBitmap() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPrintRegisterBitmap = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2648:2: (iv_ruleStatemachineActionPeripheralPrintRegisterBitmap= ruleStatemachineActionPeripheralPrintRegisterBitmap EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2649:2: iv_ruleStatemachineActionPeripheralPrintRegisterBitmap= ruleStatemachineActionPeripheralPrintRegisterBitmap EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintRegisterBitmap_in_entryRuleStatemachineActionPeripheralPrintRegisterBitmap5974);
+            iv_ruleStatemachineActionPeripheralPrintRegisterBitmap=ruleStatemachineActionPeripheralPrintRegisterBitmap();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPrintRegisterBitmap; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintRegisterBitmap5984); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPrintRegisterBitmap"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPrintRegisterBitmap"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2656:1: ruleStatemachineActionPeripheralPrintRegisterBitmap returns [EObject current=null] : (otherlv_0= 'registerBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= 'name' ( (lv_name_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPrintRegisterBitmap() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_bitmapId_2_0=null;
+        Token otherlv_3=null;
+        Token lv_name_4_0=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2659:28: ( (otherlv_0= 'registerBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= 'name' ( (lv_name_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2660:1: (otherlv_0= 'registerBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= 'name' ( (lv_name_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2660:1: (otherlv_0= 'registerBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= 'name' ( (lv_name_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2660:3: otherlv_0= 'registerBitmap' otherlv_1= 'id' ( (lv_bitmapId_2_0= RULE_INT ) ) otherlv_3= 'name' ( (lv_name_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,66,FOLLOW_66_in_ruleStatemachineActionPeripheralPrintRegisterBitmap6021); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getRegisterBitmapKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,48,FOLLOW_48_in_ruleStatemachineActionPeripheralPrintRegisterBitmap6033); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getIdKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2668:1: ( (lv_bitmapId_2_0= RULE_INT ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2669:1: (lv_bitmapId_2_0= RULE_INT )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2669:1: (lv_bitmapId_2_0= RULE_INT )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2670:3: lv_bitmapId_2_0= RULE_INT
+            {
+            lv_bitmapId_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleStatemachineActionPeripheralPrintRegisterBitmap6050); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_bitmapId_2_0, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"bitmapId",
+                      		lv_bitmapId_2_0, 
+                      		"INT");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,67,FOLLOW_67_in_ruleStatemachineActionPeripheralPrintRegisterBitmap6067); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getNameKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2690:1: ( (lv_name_4_0= RULE_STRING ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2691:1: (lv_name_4_0= RULE_STRING )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2691:1: (lv_name_4_0= RULE_STRING )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2692:3: lv_name_4_0= RULE_STRING
+            {
+            lv_name_4_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleStatemachineActionPeripheralPrintRegisterBitmap6084); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_name_4_0, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getNameSTRINGTerminalRuleCall_4_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"name",
+                      		lv_name_4_0, 
+                      		"STRING");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPrintRegisterBitmap6101); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getCommercialAtKeyword_5());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2712:1: ( (otherlv_6= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2713:1: (otherlv_6= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2713:1: (otherlv_6= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2714:3: otherlv_6= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule());
+              	        }
+                      
+            }
+            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPrintRegisterBitmap6121); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPrintRegisterBitmap"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPTOpen"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2733:1: entryRuleStatemachineActionPeripheralPTOpen returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPTOpen= ruleStatemachineActionPeripheralPTOpen EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPTOpen() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPTOpen = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2734:2: (iv_ruleStatemachineActionPeripheralPTOpen= ruleStatemachineActionPeripheralPTOpen EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2735:2: iv_ruleStatemachineActionPeripheralPTOpen= ruleStatemachineActionPeripheralPTOpen EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTOpenRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTOpen_in_entryRuleStatemachineActionPeripheralPTOpen6157);
+            iv_ruleStatemachineActionPeripheralPTOpen=ruleStatemachineActionPeripheralPTOpen();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPTOpen; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTOpen6167); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPTOpen"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPTOpen"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2742:1: ruleStatemachineActionPeripheralPTOpen returns [EObject current=null] : (otherlv_0= 'paymentOpen' otherlv_1= 'host' ( (lv_host_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'port' ( (lv_port_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPTOpen() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        EObject lv_host_2_0 = null;
+
+        EObject lv_port_4_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2745:28: ( (otherlv_0= 'paymentOpen' otherlv_1= 'host' ( (lv_host_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'port' ( (lv_port_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2746:1: (otherlv_0= 'paymentOpen' otherlv_1= 'host' ( (lv_host_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'port' ( (lv_port_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2746:1: (otherlv_0= 'paymentOpen' otherlv_1= 'host' ( (lv_host_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'port' ( (lv_port_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2746:3: otherlv_0= 'paymentOpen' otherlv_1= 'host' ( (lv_host_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'port' ( (lv_port_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,68,FOLLOW_68_in_ruleStatemachineActionPeripheralPTOpen6204); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getPaymentOpenKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,69,FOLLOW_69_in_ruleStatemachineActionPeripheralPTOpen6216); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getHostKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2754:1: ( (lv_host_2_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2755:1: (lv_host_2_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2755:1: (lv_host_2_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2756:3: lv_host_2_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getHostStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralPTOpen6237);
+            lv_host_2_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTOpenRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"host",
+                      		lv_host_2_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,70,FOLLOW_70_in_ruleStatemachineActionPeripheralPTOpen6249); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getPortKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2776:1: ( (lv_port_4_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2777:1: (lv_port_4_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2777:1: (lv_port_4_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2778:3: lv_port_4_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getPortStatemachineActionFieldConcatenationParserRuleCall_4_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralPTOpen6270);
+            lv_port_4_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTOpenRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"port",
+                      		lv_port_4_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPTOpen6282); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getCommercialAtKeyword_5());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2798:1: ( (otherlv_6= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2799:1: (otherlv_6= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2799:1: (otherlv_6= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2800:3: otherlv_6= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTOpenRule());
+              	        }
+                      
+            }
+            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPTOpen6302); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_6_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPTOpen"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPTClose"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2819:1: entryRuleStatemachineActionPeripheralPTClose returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPTClose= ruleStatemachineActionPeripheralPTClose EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPTClose() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPTClose = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2820:2: (iv_ruleStatemachineActionPeripheralPTClose= ruleStatemachineActionPeripheralPTClose EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2821:2: iv_ruleStatemachineActionPeripheralPTClose= ruleStatemachineActionPeripheralPTClose EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTCloseRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTClose_in_entryRuleStatemachineActionPeripheralPTClose6338);
+            iv_ruleStatemachineActionPeripheralPTClose=ruleStatemachineActionPeripheralPTClose();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPTClose; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTClose6348); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPTClose"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPTClose"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2828:1: ruleStatemachineActionPeripheralPTClose returns [EObject current=null] : (otherlv_0= 'paymentClose' otherlv_1= '@' ( (otherlv_2= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPTClose() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2831:28: ( (otherlv_0= 'paymentClose' otherlv_1= '@' ( (otherlv_2= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2832:1: (otherlv_0= 'paymentClose' otherlv_1= '@' ( (otherlv_2= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2832:1: (otherlv_0= 'paymentClose' otherlv_1= '@' ( (otherlv_2= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2832:3: otherlv_0= 'paymentClose' otherlv_1= '@' ( (otherlv_2= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,71,FOLLOW_71_in_ruleStatemachineActionPeripheralPTClose6385); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getPaymentCloseKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPTClose6397); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getCommercialAtKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2840:1: ( (otherlv_2= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2841:1: (otherlv_2= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2841:1: (otherlv_2= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2842:3: otherlv_2= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTCloseRule());
+              	        }
+                      
+            }
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPTClose6417); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_2_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPTClose"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPTAcknowledge"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2861:1: entryRuleStatemachineActionPeripheralPTAcknowledge returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPTAcknowledge= ruleStatemachineActionPeripheralPTAcknowledge EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPTAcknowledge() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPTAcknowledge = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2862:2: (iv_ruleStatemachineActionPeripheralPTAcknowledge= ruleStatemachineActionPeripheralPTAcknowledge EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2863:2: iv_ruleStatemachineActionPeripheralPTAcknowledge= ruleStatemachineActionPeripheralPTAcknowledge EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTAcknowledge_in_entryRuleStatemachineActionPeripheralPTAcknowledge6453);
+            iv_ruleStatemachineActionPeripheralPTAcknowledge=ruleStatemachineActionPeripheralPTAcknowledge();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPTAcknowledge; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTAcknowledge6463); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPTAcknowledge"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPTAcknowledge"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2870:1: ruleStatemachineActionPeripheralPTAcknowledge returns [EObject current=null] : (otherlv_0= 'paymentAcknowledge' otherlv_1= '@' ( (otherlv_2= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPTAcknowledge() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2873:28: ( (otherlv_0= 'paymentAcknowledge' otherlv_1= '@' ( (otherlv_2= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2874:1: (otherlv_0= 'paymentAcknowledge' otherlv_1= '@' ( (otherlv_2= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2874:1: (otherlv_0= 'paymentAcknowledge' otherlv_1= '@' ( (otherlv_2= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2874:3: otherlv_0= 'paymentAcknowledge' otherlv_1= '@' ( (otherlv_2= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,72,FOLLOW_72_in_ruleStatemachineActionPeripheralPTAcknowledge6500); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getPaymentAcknowledgeKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPTAcknowledge6512); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getCommercialAtKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2882:1: ( (otherlv_2= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2883:1: (otherlv_2= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2883:1: (otherlv_2= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2884:3: otherlv_2= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule());
+              	        }
+                      
+            }
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPTAcknowledge6532); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_2_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPTAcknowledge"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPTReversal"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2903:1: entryRuleStatemachineActionPeripheralPTReversal returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPTReversal= ruleStatemachineActionPeripheralPTReversal EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPTReversal() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPTReversal = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2904:2: (iv_ruleStatemachineActionPeripheralPTReversal= ruleStatemachineActionPeripheralPTReversal EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2905:2: iv_ruleStatemachineActionPeripheralPTReversal= ruleStatemachineActionPeripheralPTReversal EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTReversalRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTReversal_in_entryRuleStatemachineActionPeripheralPTReversal6568);
+            iv_ruleStatemachineActionPeripheralPTReversal=ruleStatemachineActionPeripheralPTReversal();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPTReversal; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTReversal6578); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPTReversal"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPTReversal"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2912:1: ruleStatemachineActionPeripheralPTReversal returns [EObject current=null] : (otherlv_0= 'paymentReversal' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'ofReceipt' ( (lv_receipt_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPTReversal() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        EObject lv_password_2_0 = null;
+
+        EObject lv_receipt_4_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2915:28: ( (otherlv_0= 'paymentReversal' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'ofReceipt' ( (lv_receipt_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2916:1: (otherlv_0= 'paymentReversal' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'ofReceipt' ( (lv_receipt_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2916:1: (otherlv_0= 'paymentReversal' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'ofReceipt' ( (lv_receipt_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2916:3: otherlv_0= 'paymentReversal' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'ofReceipt' ( (lv_receipt_4_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,73,FOLLOW_73_in_ruleStatemachineActionPeripheralPTReversal6615); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getPaymentReversalKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,74,FOLLOW_74_in_ruleStatemachineActionPeripheralPTReversal6627); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getWithPasswordKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2924:1: ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2925:1: (lv_password_2_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2925:1: (lv_password_2_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2926:3: lv_password_2_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralPTReversal6648);
+            lv_password_2_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTReversalRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"password",
+                      		lv_password_2_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,75,FOLLOW_75_in_ruleStatemachineActionPeripheralPTReversal6660); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getOfReceiptKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2946:1: ( (lv_receipt_4_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2947:1: (lv_receipt_4_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2947:1: (lv_receipt_4_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2948:3: lv_receipt_4_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getReceiptStatemachineActionFieldConcatenationParserRuleCall_4_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralPTReversal6681);
+            lv_receipt_4_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTReversalRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"receipt",
+                      		lv_receipt_4_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPTReversal6693); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getCommercialAtKeyword_5());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2968:1: ( (otherlv_6= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2969:1: (otherlv_6= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2969:1: (otherlv_6= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2970:3: otherlv_6= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTReversalRule());
+              	        }
+                      
+            }
+            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPTReversal6713); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_6_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPTReversal"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPTRegistration"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2989:1: entryRuleStatemachineActionPeripheralPTRegistration returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPTRegistration= ruleStatemachineActionPeripheralPTRegistration EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPTRegistration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPTRegistration = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2990:2: (iv_ruleStatemachineActionPeripheralPTRegistration= ruleStatemachineActionPeripheralPTRegistration EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2991:2: iv_ruleStatemachineActionPeripheralPTRegistration= ruleStatemachineActionPeripheralPTRegistration EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTRegistration_in_entryRuleStatemachineActionPeripheralPTRegistration6749);
+            iv_ruleStatemachineActionPeripheralPTRegistration=ruleStatemachineActionPeripheralPTRegistration();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPTRegistration; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTRegistration6759); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPTRegistration"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPTRegistration"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:2998:1: ruleStatemachineActionPeripheralPTRegistration returns [EObject current=null] : (otherlv_0= 'paymentRegistration' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'configuration' ( (lv_configuration_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPTRegistration() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token lv_configuration_4_0=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        EObject lv_password_2_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3001:28: ( (otherlv_0= 'paymentRegistration' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'configuration' ( (lv_configuration_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3002:1: (otherlv_0= 'paymentRegistration' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'configuration' ( (lv_configuration_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3002:1: (otherlv_0= 'paymentRegistration' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'configuration' ( (lv_configuration_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3002:3: otherlv_0= 'paymentRegistration' otherlv_1= 'withPassword' ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= 'configuration' ( (lv_configuration_4_0= RULE_STRING ) ) otherlv_5= '@' ( (otherlv_6= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,76,FOLLOW_76_in_ruleStatemachineActionPeripheralPTRegistration6796); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getPaymentRegistrationKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,74,FOLLOW_74_in_ruleStatemachineActionPeripheralPTRegistration6808); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getWithPasswordKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3010:1: ( (lv_password_2_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3011:1: (lv_password_2_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3011:1: (lv_password_2_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3012:3: lv_password_2_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralPTRegistration6829);
+            lv_password_2_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"password",
+                      		lv_password_2_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,77,FOLLOW_77_in_ruleStatemachineActionPeripheralPTRegistration6841); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getConfigurationKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3032:1: ( (lv_configuration_4_0= RULE_STRING ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3033:1: (lv_configuration_4_0= RULE_STRING )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3033:1: (lv_configuration_4_0= RULE_STRING )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3034:3: lv_configuration_4_0= RULE_STRING
+            {
+            lv_configuration_4_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleStatemachineActionPeripheralPTRegistration6858); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_configuration_4_0, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getConfigurationSTRINGTerminalRuleCall_4_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"configuration",
+                      		lv_configuration_4_0, 
+                      		"STRING");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPTRegistration6875); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getCommercialAtKeyword_5());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3054:1: ( (otherlv_6= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3055:1: (otherlv_6= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3055:1: (otherlv_6= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3056:3: otherlv_6= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule());
+              	        }
+                      
+            }
+            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPTRegistration6895); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_6, grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_6_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPTRegistration"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPTAuthorization"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3075:1: entryRuleStatemachineActionPeripheralPTAuthorization returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPTAuthorization= ruleStatemachineActionPeripheralPTAuthorization EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPTAuthorization() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPTAuthorization = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3076:2: (iv_ruleStatemachineActionPeripheralPTAuthorization= ruleStatemachineActionPeripheralPTAuthorization EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3077:2: iv_ruleStatemachineActionPeripheralPTAuthorization= ruleStatemachineActionPeripheralPTAuthorization EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTAuthorization_in_entryRuleStatemachineActionPeripheralPTAuthorization6931);
+            iv_ruleStatemachineActionPeripheralPTAuthorization=ruleStatemachineActionPeripheralPTAuthorization();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPTAuthorization; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTAuthorization6941); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPTAuthorization"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPTAuthorization"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3084:1: ruleStatemachineActionPeripheralPTAuthorization returns [EObject current=null] : (otherlv_0= 'paymentAuthorization' otherlv_1= 'ofAmount' ( (lv_amount_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPTAuthorization() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        EObject lv_amount_2_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3087:28: ( (otherlv_0= 'paymentAuthorization' otherlv_1= 'ofAmount' ( (lv_amount_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3088:1: (otherlv_0= 'paymentAuthorization' otherlv_1= 'ofAmount' ( (lv_amount_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3088:1: (otherlv_0= 'paymentAuthorization' otherlv_1= 'ofAmount' ( (lv_amount_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3088:3: otherlv_0= 'paymentAuthorization' otherlv_1= 'ofAmount' ( (lv_amount_2_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_3= '@' ( (otherlv_4= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,78,FOLLOW_78_in_ruleStatemachineActionPeripheralPTAuthorization6978); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getPaymentAuthorizationKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,79,FOLLOW_79_in_ruleStatemachineActionPeripheralPTAuthorization6990); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getOfAmountKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3096:1: ( (lv_amount_2_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3097:1: (lv_amount_2_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3097:1: (lv_amount_2_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3098:3: lv_amount_2_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getAmountStatemachineActionFieldConcatenationParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineActionPeripheralPTAuthorization7011);
+            lv_amount_2_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"amount",
+                      		lv_amount_2_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,29,FOLLOW_29_in_ruleStatemachineActionPeripheralPTAuthorization7023); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getCommercialAtKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3118:1: ( (otherlv_4= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3119:1: (otherlv_4= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3119:1: (otherlv_4= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3120:3: otherlv_4= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule());
+              	        }
+                      
+            }
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPTAuthorization7043); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_4, grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_4_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPTAuthorization"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPTResponse"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3139:1: entryRuleStatemachineActionPeripheralPTResponse returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPTResponse= ruleStatemachineActionPeripheralPTResponse EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPTResponse() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPTResponse = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3140:2: (iv_ruleStatemachineActionPeripheralPTResponse= ruleStatemachineActionPeripheralPTResponse EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3141:2: iv_ruleStatemachineActionPeripheralPTResponse= ruleStatemachineActionPeripheralPTResponse EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPTResponseRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTResponse_in_entryRuleStatemachineActionPeripheralPTResponse7079);
+            iv_ruleStatemachineActionPeripheralPTResponse=ruleStatemachineActionPeripheralPTResponse();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPTResponse; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPTResponse7089); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPTResponse"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPTResponse"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3148:1: ruleStatemachineActionPeripheralPTResponse returns [EObject current=null] : (otherlv_0= 'paymentResponse' otherlv_1= 'from' ( (otherlv_2= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineActionPeripheralPTResponse() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3151:28: ( (otherlv_0= 'paymentResponse' otherlv_1= 'from' ( (otherlv_2= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3152:1: (otherlv_0= 'paymentResponse' otherlv_1= 'from' ( (otherlv_2= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3152:1: (otherlv_0= 'paymentResponse' otherlv_1= 'from' ( (otherlv_2= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3152:3: otherlv_0= 'paymentResponse' otherlv_1= 'from' ( (otherlv_2= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,80,FOLLOW_80_in_ruleStatemachineActionPeripheralPTResponse7126); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getPaymentResponseKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,81,FOLLOW_81_in_ruleStatemachineActionPeripheralPTResponse7138); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getFromKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3160:1: ( (otherlv_2= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3161:1: (otherlv_2= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3161:1: (otherlv_2= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3162:3: otherlv_2= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPTResponseRule());
+              	        }
+                      
+            }
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPTResponse7158); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_2, grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getDeviceStatemachinePeripheralDevicePTCrossReference_2_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPTResponse"
+
+
+    // $ANTLR start "entryRuleStatemachineActionPeripheralPrintReport"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3181:1: entryRuleStatemachineActionPeripheralPrintReport returns [EObject current=null] : iv_ruleStatemachineActionPeripheralPrintReport= ruleStatemachineActionPeripheralPrintReport EOF ;
+    public final EObject entryRuleStatemachineActionPeripheralPrintReport() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionPeripheralPrintReport = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3182:2: (iv_ruleStatemachineActionPeripheralPrintReport= ruleStatemachineActionPeripheralPrintReport EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3183:2: iv_ruleStatemachineActionPeripheralPrintReport= ruleStatemachineActionPeripheralPrintReport EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionPeripheralPrintReportRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionPeripheralPrintReport_in_entryRuleStatemachineActionPeripheralPrintReport7194);
+            iv_ruleStatemachineActionPeripheralPrintReport=ruleStatemachineActionPeripheralPrintReport();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionPeripheralPrintReport; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionPeripheralPrintReport7204); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionPeripheralPrintReport"
+
+
+    // $ANTLR start "ruleStatemachineActionPeripheralPrintReport"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3190:1: ruleStatemachineActionPeripheralPrintReport returns [EObject current=null] : (otherlv_0= 'printReport' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasFilter_2_0= 'from' ) ) ( (otherlv_3= RULE_ID ) ) )? ) ;
+    public final EObject ruleStatemachineActionPeripheralPrintReport() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_hasFilter_2_0=null;
+        Token otherlv_3=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3193:28: ( (otherlv_0= 'printReport' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasFilter_2_0= 'from' ) ) ( (otherlv_3= RULE_ID ) ) )? ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3194:1: (otherlv_0= 'printReport' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasFilter_2_0= 'from' ) ) ( (otherlv_3= RULE_ID ) ) )? )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3194:1: (otherlv_0= 'printReport' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasFilter_2_0= 'from' ) ) ( (otherlv_3= RULE_ID ) ) )? )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3194:3: otherlv_0= 'printReport' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasFilter_2_0= 'from' ) ) ( (otherlv_3= RULE_ID ) ) )?
+            {
+            otherlv_0=(Token)match(input,82,FOLLOW_82_in_ruleStatemachineActionPeripheralPrintReport7241); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getPrintReportKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3198:1: ( (otherlv_1= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3199:1: (otherlv_1= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3199:1: (otherlv_1= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3200:3: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintReportRule());
+              	        }
+                      
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPrintReport7261); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_1, grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getReportReportCrossReference_1_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3211:2: ( ( (lv_hasFilter_2_0= 'from' ) ) ( (otherlv_3= RULE_ID ) ) )?
+            int alt21=2;
+            int LA21_0 = input.LA(1);
+
+            if ( (LA21_0==81) ) {
+                alt21=1;
+            }
+            switch (alt21) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3211:3: ( (lv_hasFilter_2_0= 'from' ) ) ( (otherlv_3= RULE_ID ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3211:3: ( (lv_hasFilter_2_0= 'from' ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3212:1: (lv_hasFilter_2_0= 'from' )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3212:1: (lv_hasFilter_2_0= 'from' )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3213:3: lv_hasFilter_2_0= 'from'
+                    {
+                    lv_hasFilter_2_0=(Token)match(input,81,FOLLOW_81_in_ruleStatemachineActionPeripheralPrintReport7280); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              newLeafNode(lv_hasFilter_2_0, grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getHasFilterFromKeyword_2_0_0());
+                          
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintReportRule());
+                      	        }
+                             		setWithLastConsumed(current, "hasFilter", true, "from");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3226:2: ( (otherlv_3= RULE_ID ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3227:1: (otherlv_3= RULE_ID )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3227:1: (otherlv_3= RULE_ID )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3228:3: otherlv_3= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineActionPeripheralPrintReportRule());
+                      	        }
+                              
+                    }
+                    otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineActionPeripheralPrintReport7313); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      		newLeafNode(otherlv_3, grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getKeyStatemachineStorageCrossReference_2_1_0()); 
+                      	
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionPeripheralPrintReport"
+
+
+    // $ANTLR start "entryRuleStatemachineActionFieldSource"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3247:1: entryRuleStatemachineActionFieldSource returns [EObject current=null] : iv_ruleStatemachineActionFieldSource= ruleStatemachineActionFieldSource EOF ;
+    public final EObject entryRuleStatemachineActionFieldSource() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineActionFieldSource = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3248:2: (iv_ruleStatemachineActionFieldSource= ruleStatemachineActionFieldSource EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3249:2: iv_ruleStatemachineActionFieldSource= ruleStatemachineActionFieldSource EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineActionFieldSourceRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldSource_in_entryRuleStatemachineActionFieldSource7351);
+            iv_ruleStatemachineActionFieldSource=ruleStatemachineActionFieldSource();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineActionFieldSource; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineActionFieldSource7361); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineActionFieldSource"
+
+
+    // $ANTLR start "ruleStatemachineActionFieldSource"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3256:1: ruleStatemachineActionFieldSource returns [EObject current=null] : (this_StatemachineActionFieldSourceString_0= ruleStatemachineActionFieldSourceString | this_StatemachineActionFieldSourceNumber_1= ruleStatemachineActionFieldSourceNumber | this_StatemachineActionFieldSourceEvaluate_2= ruleStatemachineActionFieldSourceEvaluate | this_StatemachineActionFieldSourceTranslate_3= ruleStatemachineActionFieldSourceTranslate | this_StatemachineActionFieldGet_4= ruleStatemachineActionFieldGet | this_StatemachineFunction_5= ruleStatemachineFunction | this_StatemachineStorageRetrieve_6= ruleStatemachineStorageRetrieve | this_StatemachineActionFieldSourceDtoAttribute_7= ruleStatemachineActionFieldSourceDtoAttribute | this_StatemachineActionFieldSourceEvent_8= ruleStatemachineActionFieldSourceEvent | this_StatemachineActionPeripheralPTResponse_9= ruleStatemachineActionPeripheralPTResponse ) ;
+    public final EObject ruleStatemachineActionFieldSource() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_StatemachineActionFieldSourceString_0 = null;
+
+        EObject this_StatemachineActionFieldSourceNumber_1 = null;
+
+        EObject this_StatemachineActionFieldSourceEvaluate_2 = null;
+
+        EObject this_StatemachineActionFieldSourceTranslate_3 = null;
+
+        EObject this_StatemachineActionFieldGet_4 = null;
+
+        EObject this_StatemachineFunction_5 = null;
+
+        EObject this_StatemachineStorageRetrieve_6 = null;
+
+        EObject this_StatemachineActionFieldSourceDtoAttribute_7 = null;
+
+        EObject this_StatemachineActionFieldSourceEvent_8 = null;
+
+        EObject this_StatemachineActionPeripheralPTResponse_9 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3259:28: ( (this_StatemachineActionFieldSourceString_0= ruleStatemachineActionFieldSourceString | this_StatemachineActionFieldSourceNumber_1= ruleStatemachineActionFieldSourceNumber | this_StatemachineActionFieldSourceEvaluate_2= ruleStatemachineActionFieldSourceEvaluate | this_StatemachineActionFieldSourceTranslate_3= ruleStatemachineActionFieldSourceTranslate | this_StatemachineActionFieldGet_4= ruleStatemachineActionFieldGet | this_StatemachineFunction_5= ruleStatemachineFunction | this_StatemachineStorageRetrieve_6= ruleStatemachineStorageRetrieve | this_StatemachineActionFieldSourceDtoAttribute_7= ruleStatemachineActionFieldSourceDtoAttribute | this_StatemachineActionFieldSourceEvent_8= ruleStatemachineActionFieldSourceEvent | this_StatemachineActionPeripheralPTResponse_9= ruleStatemachineActionPeripheralPTResponse ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3260:1: (this_StatemachineActionFieldSourceString_0= ruleStatemachineActionFieldSourceString | this_StatemachineActionFieldSourceNumber_1= ruleStatemachineActionFieldSourceNumber | this_StatemachineActionFieldSourceEvaluate_2= ruleStatemachineActionFieldSourceEvaluate | this_StatemachineActionFieldSourceTranslate_3= ruleStatemachineActionFieldSourceTranslate | this_StatemachineActionFieldGet_4= ruleStatemachineActionFieldGet | this_StatemachineFunction_5= ruleStatemachineFunction | this_StatemachineStorageRetrieve_6= ruleStatemachineStorageRetrieve | this_StatemachineActionFieldSourceDtoAttribute_7= ruleStatemachineActionFieldSourceDtoAttribute | this_StatemachineActionFieldSourceEvent_8= ruleStatemachineActionFieldSourceEvent | this_StatemachineActionPeripheralPTResponse_9= ruleStatemachineActionPeripheralPTResponse )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3260:1: (this_StatemachineActionFieldSourceString_0= ruleStatemachineActionFieldSourceString | this_StatemachineActionFieldSourceNumber_1= ruleStatemachineActionFieldSourceNumber | this_StatemachineActionFieldSourceEvaluate_2= ruleStatemachineActionFieldSourceEvaluate | this_StatemachineActionFieldSourceTranslate_3= ruleStatemachineActionFieldSourceTranslate | this_StatemachineActionFieldGet_4= ruleStatemachineActionFieldGet | this_StatemachineFunction_5= ruleStatemachineFunction | this_StatemachineStorageRetrieve_6= ruleStatemachineStorageRetrieve | this_StatemachineActionFieldSourceDtoAttribute_7= ruleStatemachineActionFieldSourceDtoAttribute | this_StatemachineActionFieldSourceEvent_8= ruleStatemachineActionFieldSourceEvent | this_StatemachineActionPeripheralPTResponse_9= ruleStatemachineActionPeripheralPTResponse )
+            int alt22=10;
+            switch ( input.LA(1) ) {
+            case RULE_STRING:
+                {
+                alt22=1;
+                }
+                break;
+            case RULE_INT:
+            case 126:
+                {
+                alt22=2;
+                }
+                break;
+            case 199:
+            case 200:
+            case 201:
+            case 202:
+            case 203:
+            case 204:
+            case 205:
+            case 206:
+            case 207:
+            case 208:
+            case 209:
+            case 210:
+            case 211:
+            case 212:
+                {
+                alt22=3;
+                }
+                break;
+            case 95:
+                {
+                alt22=4;
+                }
+                break;
+            case 98:
+                {
+                alt22=5;
+                }
+                break;
+            case 90:
+                {
+                alt22=6;
+                }
+                break;
+            case 94:
+                {
+                alt22=7;
+                }
+                break;
+            case 96:
+                {
+                alt22=8;
+                }
+                break;
+            case 24:
+                {
+                alt22=9;
+                }
+                break;
+            case 80:
+                {
+                alt22=10;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 22, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt22) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3261:5: this_StatemachineActionFieldSourceString_0= ruleStatemachineActionFieldSourceString
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceStringParserRuleCall_0()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldSourceString_in_ruleStatemachineActionFieldSource7408);
+                    this_StatemachineActionFieldSourceString_0=ruleStatemachineActionFieldSourceString();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldSourceString_0; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3271:5: this_StatemachineActionFieldSourceNumber_1= ruleStatemachineActionFieldSourceNumber
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceNumberParserRuleCall_1()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldSourceNumber_in_ruleStatemachineActionFieldSource7435);
+                    this_StatemachineActionFieldSourceNumber_1=ruleStatemachineActionFieldSourceNumber();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldSourceNumber_1; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3281:5: this_StatemachineActionFieldSourceEvaluate_2= ruleStatemachineActionFieldSourceEvaluate
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEvaluateParserRuleCall_2()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldSourceEvaluate_in_ruleStatemachineActionFieldSource7462);
+                    this_StatemachineActionFieldSourceEvaluate_2=ruleStatemachineActionFieldSourceEvaluate();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldSourceEvaluate_2; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3291:5: this_StatemachineActionFieldSourceTranslate_3= ruleStatemachineActionFieldSourceTranslate
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceTranslateParserRuleCall_3()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldSourceTranslate_in_ruleStatemachineActionFieldSource7489);
+                    this_StatemachineActionFieldSourceTranslate_3=ruleStatemachineActionFieldSourceTranslate();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldSourceTranslate_3; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3301:5: this_StatemachineActionFieldGet_4= ruleStatemachineActionFieldGet
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldGetParserRuleCall_4()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldGet_in_ruleStatemachineActionFieldSource7516);
+                    this_StatemachineActionFieldGet_4=ruleStatemachineActionFieldGet();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldGet_4; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3311:5: this_StatemachineFunction_5= ruleStatemachineFunction
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineFunctionParserRuleCall_5()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineFunction_in_ruleStatemachineActionFieldSource7543);
+                    this_StatemachineFunction_5=ruleStatemachineFunction();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineFunction_5; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3321:5: this_StatemachineStorageRetrieve_6= ruleStatemachineStorageRetrieve
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineStorageRetrieveParserRuleCall_6()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineStorageRetrieve_in_ruleStatemachineActionFieldSource7570);
+                    this_StatemachineStorageRetrieve_6=ruleStatemachineStorageRetrieve();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineStorageRetrieve_6; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3331:5: this_StatemachineActionFieldSourceDtoAttribute_7= ruleStatemachineActionFieldSourceDtoAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceDtoAttributeParserRuleCall_7()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldSourceDtoAttribute_in_ruleStatemachineActionFieldSource7597);
+                    this_StatemachineActionFieldSourceDtoAttribute_7=ruleStatemachineActionFieldSourceDtoAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldSourceDtoAttribute_7; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3341:5: this_StatemachineActionFieldSourceEvent_8= ruleStatemachineActionFieldSourceEvent
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEventParserRuleCall_8()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionFieldSourceEvent_in_ruleStatemachineActionFieldSource7624);
+                    this_StatemachineActionFieldSourceEvent_8=ruleStatemachineActionFieldSourceEvent();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionFieldSourceEvent_8; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3351:5: this_StatemachineActionPeripheralPTResponse_9= ruleStatemachineActionPeripheralPTResponse
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionPeripheralPTResponseParserRuleCall_9()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineActionPeripheralPTResponse_in_ruleStatemachineActionFieldSource7651);
+                    this_StatemachineActionPeripheralPTResponse_9=ruleStatemachineActionPeripheralPTResponse();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StatemachineActionPeripheralPTResponse_9; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineActionFieldSource"
+
+
+    // $ANTLR start "entryRuleStatemachineOperation"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3367:1: entryRuleStatemachineOperation returns [EObject current=null] : iv_ruleStatemachineOperation= ruleStatemachineOperation EOF ;
+    public final EObject entryRuleStatemachineOperation() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineOperation = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3368:2: (iv_ruleStatemachineOperation= ruleStatemachineOperation EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3369:2: iv_ruleStatemachineOperation= ruleStatemachineOperation EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineOperationRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineOperation_in_entryRuleStatemachineOperation7686);
+            iv_ruleStatemachineOperation=ruleStatemachineOperation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineOperation; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineOperation7696); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineOperation"
+
+
+    // $ANTLR start "ruleStatemachineOperation"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3376:1: ruleStatemachineOperation returns [EObject current=null] : (otherlv_0= 'operation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')' ) ;
+    public final EObject ruleStatemachineOperation() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        EObject lv_first_3_0 = null;
+
+        EObject lv_more_4_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3379:28: ( (otherlv_0= 'operation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')' ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3380:1: (otherlv_0= 'operation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')' )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3380:1: (otherlv_0= 'operation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3380:3: otherlv_0= 'operation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')'
+            {
+            otherlv_0=(Token)match(input,83,FOLLOW_83_in_ruleStatemachineOperation7733); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineOperationAccess().getOperationKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3384:1: ( (otherlv_1= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3385:1: (otherlv_1= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3385:1: (otherlv_1= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3386:3: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineOperationRule());
+              	        }
+                      
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineOperation7753); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_1, grammarAccess.getStatemachineOperationAccess().getOperationFunctionLibraryOperationCrossReference_1_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,84,FOLLOW_84_in_ruleStatemachineOperation7765); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineOperationAccess().getLeftParenthesisKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3401:1: ( (lv_first_3_0= ruleStatemachineOperationParameter ) )?
+            int alt23=2;
+            int LA23_0 = input.LA(1);
+
+            if ( ((LA23_0>=RULE_INT && LA23_0<=RULE_STRING)||LA23_0==24||LA23_0==80||LA23_0==90||(LA23_0>=94 && LA23_0<=96)||LA23_0==98||LA23_0==126||(LA23_0>=199 && LA23_0<=212)) ) {
+                alt23=1;
+            }
+            switch (alt23) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3402:1: (lv_first_3_0= ruleStatemachineOperationParameter )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3402:1: (lv_first_3_0= ruleStatemachineOperationParameter )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3403:3: lv_first_3_0= ruleStatemachineOperationParameter
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getStatemachineOperationAccess().getFirstStatemachineOperationParameterParserRuleCall_3_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineOperationParameter_in_ruleStatemachineOperation7786);
+                    lv_first_3_0=ruleStatemachineOperationParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElementForParent(grammarAccess.getStatemachineOperationRule());
+                      	        }
+                             		set(
+                             			current, 
+                             			"first",
+                              		lv_first_3_0, 
+                              		"StatemachineOperationParameter");
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3419:3: ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )*
+            loop24:
+            do {
+                int alt24=2;
+                int LA24_0 = input.LA(1);
+
+                if ( (LA24_0==99) ) {
+                    alt24=1;
+                }
+
+
+                switch (alt24) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3420:1: (lv_more_4_0= ruleStatemachineOperationParameterMore )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3420:1: (lv_more_4_0= ruleStatemachineOperationParameterMore )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3421:3: lv_more_4_0= ruleStatemachineOperationParameterMore
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getStatemachineOperationAccess().getMoreStatemachineOperationParameterMoreParserRuleCall_4_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStatemachineOperationParameterMore_in_ruleStatemachineOperation7808);
+            	    lv_more_4_0=ruleStatemachineOperationParameterMore();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getStatemachineOperationRule());
+            	      	        }
+            	             		add(
+            	             			current, 
+            	             			"more",
+            	              		lv_more_4_0, 
+            	              		"StatemachineOperationParameterMore");
+            	      	        afterParserOrEnumRuleCall();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop24;
+                }
+            } while (true);
+
+            otherlv_5=(Token)match(input,85,FOLLOW_85_in_ruleStatemachineOperation7821); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineOperationAccess().getRightParenthesisKeyword_5());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineOperation"
+
+
+    // $ANTLR start "entryRuleStatemachineGuard"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3449:1: entryRuleStatemachineGuard returns [EObject current=null] : iv_ruleStatemachineGuard= ruleStatemachineGuard EOF ;
+    public final EObject entryRuleStatemachineGuard() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineGuard = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3450:2: (iv_ruleStatemachineGuard= ruleStatemachineGuard EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3451:2: iv_ruleStatemachineGuard= ruleStatemachineGuard EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineGuardRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineGuard_in_entryRuleStatemachineGuard7857);
+            iv_ruleStatemachineGuard=ruleStatemachineGuard();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineGuard; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineGuard7867); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineGuard"
+
+
+    // $ANTLR start "ruleStatemachineGuard"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3458:1: ruleStatemachineGuard returns [EObject current=null] : (otherlv_0= 'guard' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasOnFail_2_0= 'onFail' ) ) otherlv_3= 'caption' ( (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING ) ) otherlv_5= 'description' ( (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING ) ) otherlv_7= 'type' ( (lv_onFailType_8_0= ruleStatemachineUserMessageType ) ) )? ) ;
+    public final EObject ruleStatemachineGuard() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_hasOnFail_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        AntlrDatatypeRuleToken lv_onFailCaption_4_0 = null;
+
+        AntlrDatatypeRuleToken lv_onFailDescription_6_0 = null;
+
+        Enumerator lv_onFailType_8_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3461:28: ( (otherlv_0= 'guard' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasOnFail_2_0= 'onFail' ) ) otherlv_3= 'caption' ( (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING ) ) otherlv_5= 'description' ( (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING ) ) otherlv_7= 'type' ( (lv_onFailType_8_0= ruleStatemachineUserMessageType ) ) )? ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3462:1: (otherlv_0= 'guard' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasOnFail_2_0= 'onFail' ) ) otherlv_3= 'caption' ( (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING ) ) otherlv_5= 'description' ( (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING ) ) otherlv_7= 'type' ( (lv_onFailType_8_0= ruleStatemachineUserMessageType ) ) )? )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3462:1: (otherlv_0= 'guard' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasOnFail_2_0= 'onFail' ) ) otherlv_3= 'caption' ( (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING ) ) otherlv_5= 'description' ( (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING ) ) otherlv_7= 'type' ( (lv_onFailType_8_0= ruleStatemachineUserMessageType ) ) )? )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3462:3: otherlv_0= 'guard' ( (otherlv_1= RULE_ID ) ) ( ( (lv_hasOnFail_2_0= 'onFail' ) ) otherlv_3= 'caption' ( (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING ) ) otherlv_5= 'description' ( (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING ) ) otherlv_7= 'type' ( (lv_onFailType_8_0= ruleStatemachineUserMessageType ) ) )?
+            {
+            otherlv_0=(Token)match(input,86,FOLLOW_86_in_ruleStatemachineGuard7904); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineGuardAccess().getGuardKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3466:1: ( (otherlv_1= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3467:1: (otherlv_1= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3467:1: (otherlv_1= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3468:3: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineGuardRule());
+              	        }
+                      
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineGuard7924); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_1, grammarAccess.getStatemachineGuardAccess().getGuardFunctionLibraryGuardCrossReference_1_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3479:2: ( ( (lv_hasOnFail_2_0= 'onFail' ) ) otherlv_3= 'caption' ( (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING ) ) otherlv_5= 'description' ( (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING ) ) otherlv_7= 'type' ( (lv_onFailType_8_0= ruleStatemachineUserMessageType ) ) )?
+            int alt25=2;
+            int LA25_0 = input.LA(1);
+
+            if ( (LA25_0==87) ) {
+                alt25=1;
+            }
+            switch (alt25) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3479:3: ( (lv_hasOnFail_2_0= 'onFail' ) ) otherlv_3= 'caption' ( (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING ) ) otherlv_5= 'description' ( (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING ) ) otherlv_7= 'type' ( (lv_onFailType_8_0= ruleStatemachineUserMessageType ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3479:3: ( (lv_hasOnFail_2_0= 'onFail' ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3480:1: (lv_hasOnFail_2_0= 'onFail' )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3480:1: (lv_hasOnFail_2_0= 'onFail' )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3481:3: lv_hasOnFail_2_0= 'onFail'
+                    {
+                    lv_hasOnFail_2_0=(Token)match(input,87,FOLLOW_87_in_ruleStatemachineGuard7943); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              newLeafNode(lv_hasOnFail_2_0, grammarAccess.getStatemachineGuardAccess().getHasOnFailOnFailKeyword_2_0_0());
+                          
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElement(grammarAccess.getStatemachineGuardRule());
+                      	        }
+                             		setWithLastConsumed(current, "hasOnFail", true, "onFail");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_3=(Token)match(input,88,FOLLOW_88_in_ruleStatemachineGuard7968); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_3, grammarAccess.getStatemachineGuardAccess().getCaptionKeyword_2_1());
+                          
+                    }
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3498:1: ( (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3499:1: (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3499:1: (lv_onFailCaption_4_0= ruleTRANSLATABLESTRING )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3500:3: lv_onFailCaption_4_0= ruleTRANSLATABLESTRING
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getStatemachineGuardAccess().getOnFailCaptionTRANSLATABLESTRINGParserRuleCall_2_2_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleTRANSLATABLESTRING_in_ruleStatemachineGuard7989);
+                    lv_onFailCaption_4_0=ruleTRANSLATABLESTRING();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElementForParent(grammarAccess.getStatemachineGuardRule());
+                      	        }
+                             		set(
+                             			current, 
+                             			"onFailCaption",
+                              		lv_onFailCaption_4_0, 
+                              		"TRANSLATABLESTRING");
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_5=(Token)match(input,89,FOLLOW_89_in_ruleStatemachineGuard8001); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_5, grammarAccess.getStatemachineGuardAccess().getDescriptionKeyword_2_3());
+                          
+                    }
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3520:1: ( (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3521:1: (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3521:1: (lv_onFailDescription_6_0= ruleTRANSLATABLESTRING )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3522:3: lv_onFailDescription_6_0= ruleTRANSLATABLESTRING
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getStatemachineGuardAccess().getOnFailDescriptionTRANSLATABLESTRINGParserRuleCall_2_4_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleTRANSLATABLESTRING_in_ruleStatemachineGuard8022);
+                    lv_onFailDescription_6_0=ruleTRANSLATABLESTRING();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElementForParent(grammarAccess.getStatemachineGuardRule());
+                      	        }
+                             		set(
+                             			current, 
+                             			"onFailDescription",
+                              		lv_onFailDescription_6_0, 
+                              		"TRANSLATABLESTRING");
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_7=(Token)match(input,51,FOLLOW_51_in_ruleStatemachineGuard8034); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_7, grammarAccess.getStatemachineGuardAccess().getTypeKeyword_2_5());
+                          
+                    }
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3542:1: ( (lv_onFailType_8_0= ruleStatemachineUserMessageType ) )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3543:1: (lv_onFailType_8_0= ruleStatemachineUserMessageType )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3543:1: (lv_onFailType_8_0= ruleStatemachineUserMessageType )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3544:3: lv_onFailType_8_0= ruleStatemachineUserMessageType
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getStatemachineGuardAccess().getOnFailTypeStatemachineUserMessageTypeEnumRuleCall_2_6_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineUserMessageType_in_ruleStatemachineGuard8055);
+                    lv_onFailType_8_0=ruleStatemachineUserMessageType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElementForParent(grammarAccess.getStatemachineGuardRule());
+                      	        }
+                             		set(
+                             			current, 
+                             			"onFailType",
+                              		lv_onFailType_8_0, 
+                              		"StatemachineUserMessageType");
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineGuard"
+
+
+    // $ANTLR start "entryRuleStatemachineFunction"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3568:1: entryRuleStatemachineFunction returns [EObject current=null] : iv_ruleStatemachineFunction= ruleStatemachineFunction EOF ;
+    public final EObject entryRuleStatemachineFunction() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineFunction = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3569:2: (iv_ruleStatemachineFunction= ruleStatemachineFunction EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3570:2: iv_ruleStatemachineFunction= ruleStatemachineFunction EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineFunctionRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineFunction_in_entryRuleStatemachineFunction8093);
+            iv_ruleStatemachineFunction=ruleStatemachineFunction();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineFunction; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineFunction8103); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineFunction"
+
+
+    // $ANTLR start "ruleStatemachineFunction"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3577:1: ruleStatemachineFunction returns [EObject current=null] : (otherlv_0= 'function' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')' ) ;
+    public final EObject ruleStatemachineFunction() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        EObject lv_first_3_0 = null;
+
+        EObject lv_more_4_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3580:28: ( (otherlv_0= 'function' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')' ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3581:1: (otherlv_0= 'function' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')' )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3581:1: (otherlv_0= 'function' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')' )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3581:3: otherlv_0= 'function' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( (lv_first_3_0= ruleStatemachineOperationParameter ) )? ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )* otherlv_5= ')'
+            {
+            otherlv_0=(Token)match(input,90,FOLLOW_90_in_ruleStatemachineFunction8140); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineFunctionAccess().getFunctionKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3585:1: ( (otherlv_1= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3586:1: (otherlv_1= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3586:1: (otherlv_1= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3587:3: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineFunctionRule());
+              	        }
+                      
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineFunction8160); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_1, grammarAccess.getStatemachineFunctionAccess().getFunctionFunctionLibraryFunctionCrossReference_1_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,84,FOLLOW_84_in_ruleStatemachineFunction8172); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineFunctionAccess().getLeftParenthesisKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3602:1: ( (lv_first_3_0= ruleStatemachineOperationParameter ) )?
+            int alt26=2;
+            int LA26_0 = input.LA(1);
+
+            if ( ((LA26_0>=RULE_INT && LA26_0<=RULE_STRING)||LA26_0==24||LA26_0==80||LA26_0==90||(LA26_0>=94 && LA26_0<=96)||LA26_0==98||LA26_0==126||(LA26_0>=199 && LA26_0<=212)) ) {
+                alt26=1;
+            }
+            switch (alt26) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3603:1: (lv_first_3_0= ruleStatemachineOperationParameter )
+                    {
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3603:1: (lv_first_3_0= ruleStatemachineOperationParameter )
+                    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3604:3: lv_first_3_0= ruleStatemachineOperationParameter
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getStatemachineFunctionAccess().getFirstStatemachineOperationParameterParserRuleCall_3_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleStatemachineOperationParameter_in_ruleStatemachineFunction8193);
+                    lv_first_3_0=ruleStatemachineOperationParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      	        if (current==null) {
+                      	            current = createModelElementForParent(grammarAccess.getStatemachineFunctionRule());
+                      	        }
+                             		set(
+                             			current, 
+                             			"first",
+                              		lv_first_3_0, 
+                              		"StatemachineOperationParameter");
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3620:3: ( (lv_more_4_0= ruleStatemachineOperationParameterMore ) )*
+            loop27:
+            do {
+                int alt27=2;
+                int LA27_0 = input.LA(1);
+
+                if ( (LA27_0==99) ) {
+                    alt27=1;
+                }
+
+
+                switch (alt27) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3621:1: (lv_more_4_0= ruleStatemachineOperationParameterMore )
+            	    {
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3621:1: (lv_more_4_0= ruleStatemachineOperationParameterMore )
+            	    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3622:3: lv_more_4_0= ruleStatemachineOperationParameterMore
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getStatemachineFunctionAccess().getMoreStatemachineOperationParameterMoreParserRuleCall_4_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStatemachineOperationParameterMore_in_ruleStatemachineFunction8215);
+            	    lv_more_4_0=ruleStatemachineOperationParameterMore();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getStatemachineFunctionRule());
+            	      	        }
+            	             		add(
+            	             			current, 
+            	             			"more",
+            	              		lv_more_4_0, 
+            	              		"StatemachineOperationParameterMore");
+            	      	        afterParserOrEnumRuleCall();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop27;
+                }
+            } while (true);
+
+            otherlv_5=(Token)match(input,85,FOLLOW_85_in_ruleStatemachineFunction8228); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getStatemachineFunctionAccess().getRightParenthesisKeyword_5());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineFunction"
+
+
+    // $ANTLR start "entryRuleStatemachineStorage"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3650:1: entryRuleStatemachineStorage returns [EObject current=null] : iv_ruleStatemachineStorage= ruleStatemachineStorage EOF ;
+    public final EObject entryRuleStatemachineStorage() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineStorage = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3651:2: (iv_ruleStatemachineStorage= ruleStatemachineStorage EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3652:2: iv_ruleStatemachineStorage= ruleStatemachineStorage EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineStorageRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineStorage_in_entryRuleStatemachineStorage8264);
+            iv_ruleStatemachineStorage=ruleStatemachineStorage();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineStorage; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineStorage8274); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineStorage"
+
+
+    // $ANTLR start "ruleStatemachineStorage"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3659:1: ruleStatemachineStorage returns [EObject current=null] : (otherlv_0= 'store' ( (lv_content_1_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_2= 'with' ( (lv_key_3_0= RULE_ID ) ) otherlv_4= '.' ( (lv_attribute_5_0= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineStorage() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token lv_key_3_0=null;
+        Token otherlv_4=null;
+        Token lv_attribute_5_0=null;
+        EObject lv_content_1_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3662:28: ( (otherlv_0= 'store' ( (lv_content_1_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_2= 'with' ( (lv_key_3_0= RULE_ID ) ) otherlv_4= '.' ( (lv_attribute_5_0= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3663:1: (otherlv_0= 'store' ( (lv_content_1_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_2= 'with' ( (lv_key_3_0= RULE_ID ) ) otherlv_4= '.' ( (lv_attribute_5_0= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3663:1: (otherlv_0= 'store' ( (lv_content_1_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_2= 'with' ( (lv_key_3_0= RULE_ID ) ) otherlv_4= '.' ( (lv_attribute_5_0= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3663:3: otherlv_0= 'store' ( (lv_content_1_0= ruleStatemachineActionFieldConcatenation ) ) otherlv_2= 'with' ( (lv_key_3_0= RULE_ID ) ) otherlv_4= '.' ( (lv_attribute_5_0= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,91,FOLLOW_91_in_ruleStatemachineStorage8311); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineStorageAccess().getStoreKeyword_0());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3667:1: ( (lv_content_1_0= ruleStatemachineActionFieldConcatenation ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3668:1: (lv_content_1_0= ruleStatemachineActionFieldConcatenation )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3668:1: (lv_content_1_0= ruleStatemachineActionFieldConcatenation )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3669:3: lv_content_1_0= ruleStatemachineActionFieldConcatenation
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStatemachineStorageAccess().getContentStatemachineActionFieldConcatenationParserRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStatemachineActionFieldConcatenation_in_ruleStatemachineStorage8332);
+            lv_content_1_0=ruleStatemachineActionFieldConcatenation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getStatemachineStorageRule());
+              	        }
+                     		set(
+                     			current, 
+                     			"content",
+                      		lv_content_1_0, 
+                      		"StatemachineActionFieldConcatenation");
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,92,FOLLOW_92_in_ruleStatemachineStorage8344); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_2, grammarAccess.getStatemachineStorageAccess().getWithKeyword_2());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3689:1: ( (lv_key_3_0= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3690:1: (lv_key_3_0= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3690:1: (lv_key_3_0= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3691:3: lv_key_3_0= RULE_ID
+            {
+            lv_key_3_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineStorage8361); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_key_3_0, grammarAccess.getStatemachineStorageAccess().getKeyIDTerminalRuleCall_3_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineStorageRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"key",
+                      		lv_key_3_0, 
+                      		"ID");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,93,FOLLOW_93_in_ruleStatemachineStorage8378); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_4, grammarAccess.getStatemachineStorageAccess().getFullStopKeyword_4());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3711:1: ( (lv_attribute_5_0= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3712:1: (lv_attribute_5_0= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3712:1: (lv_attribute_5_0= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3713:3: lv_attribute_5_0= RULE_ID
+            {
+            lv_attribute_5_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineStorage8395); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_attribute_5_0, grammarAccess.getStatemachineStorageAccess().getAttributeIDTerminalRuleCall_5_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineStorageRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"attribute",
+                      		lv_attribute_5_0, 
+                      		"ID");
+              	    
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineStorage"
+
+
+    // $ANTLR start "entryRuleStatemachineStorageRetrieve"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3737:1: entryRuleStatemachineStorageRetrieve returns [EObject current=null] : iv_ruleStatemachineStorageRetrieve= ruleStatemachineStorageRetrieve EOF ;
+    public final EObject entryRuleStatemachineStorageRetrieve() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineStorageRetrieve = null;
+
+
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3738:2: (iv_ruleStatemachineStorageRetrieve= ruleStatemachineStorageRetrieve EOF )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3739:2: iv_ruleStatemachineStorageRetrieve= ruleStatemachineStorageRetrieve EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineStorageRetrieveRule()); 
+            }
+            pushFollow(FOLLOW_ruleStatemachineStorageRetrieve_in_entryRuleStatemachineStorageRetrieve8436);
+            iv_ruleStatemachineStorageRetrieve=ruleStatemachineStorageRetrieve();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineStorageRetrieve; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStatemachineStorageRetrieve8446); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineStorageRetrieve"
+
+
+    // $ANTLR start "ruleStatemachineStorageRetrieve"
+    // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3746:1: ruleStatemachineStorageRetrieve returns [EObject current=null] : (otherlv_0= 'retrieve' otherlv_1= 'from' ( (lv_key_2_0= RULE_ID ) ) otherlv_3= '.' ( (lv_attribute_4_0= RULE_ID ) ) ) ;
+    public final EObject ruleStatemachineStorageRetrieve() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_key_2_0=null;
+        Token otherlv_3=null;
+        Token lv_attribute_4_0=null;
+
+         enterRule(); 
+            
+        try {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3749:28: ( (otherlv_0= 'retrieve' otherlv_1= 'from' ( (lv_key_2_0= RULE_ID ) ) otherlv_3= '.' ( (lv_attribute_4_0= RULE_ID ) ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3750:1: (otherlv_0= 'retrieve' otherlv_1= 'from' ( (lv_key_2_0= RULE_ID ) ) otherlv_3= '.' ( (lv_attribute_4_0= RULE_ID ) ) )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3750:1: (otherlv_0= 'retrieve' otherlv_1= 'from' ( (lv_key_2_0= RULE_ID ) ) otherlv_3= '.' ( (lv_attribute_4_0= RULE_ID ) ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3750:3: otherlv_0= 'retrieve' otherlv_1= 'from' ( (lv_key_2_0= RULE_ID ) ) otherlv_3= '.' ( (lv_attribute_4_0= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,94,FOLLOW_94_in_ruleStatemachineStorageRetrieve8483); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_0, grammarAccess.getStatemachineStorageRetrieveAccess().getRetrieveKeyword_0());
+                  
+            }
+            otherlv_1=(Token)match(input,81,FOLLOW_81_in_ruleStatemachineStorageRetrieve8495); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getStatemachineStorageRetrieveAccess().getFromKeyword_1());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3758:1: ( (lv_key_2_0= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3759:1: (lv_key_2_0= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3759:1: (lv_key_2_0= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3760:3: lv_key_2_0= RULE_ID
+            {
+            lv_key_2_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineStorageRetrieve8512); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_key_2_0, grammarAccess.getStatemachineStorageRetrieveAccess().getKeyIDTerminalRuleCall_2_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineStorageRetrieveRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"key",
+                      		lv_key_2_0, 
+                      		"ID");
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,93,FOLLOW_93_in_ruleStatemachineStorageRetrieve8529); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getStatemachineStorageRetrieveAccess().getFullStopKeyword_3());
+                  
+            }
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3780:1: ( (lv_attribute_4_0= RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3781:1: (lv_attribute_4_0= RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3781:1: (lv_attribute_4_0= RULE_ID )
+            // ../org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/parser/antlr/internal/InternalStatemachineDSL.g:3782:3: lv_attribute_4_0= RULE_ID
+            {
+            lv_attribute_4_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStatemachineStorageRetrieve8546); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(lv_attribute_4_0, grammarAccess.getStatemachineStorageRetrieveAccess().getAttributeIDTerminalRuleCall_4_0()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getStatemachineStorageRetrieveRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"attribute",
+                      		lv_attribute_4_0, 
+                      		"ID");
+              	    
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/serializer/StatemachineDSLSemanticSequencer.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/serializer/StatemachineDSLSemanticSequencer.java
new file mode 100644
index 0000000..07fd3f3
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/serializer/StatemachineDSLSemanticSequencer.java
@@ -0,0 +1,3420 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.serializer;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.dsl.semantic.common.types.LImport;
+import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;
+import org.eclipse.osbp.xtext.statemachine.Statemachine;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButton;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlField;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDTOType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFieldType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFunction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineGuard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineModel;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+import org.eclipse.osbp.xtext.statemachine.StatemachineState;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve;
+import org.eclipse.osbp.xtext.statemachine.StatemachineTrigger;
+import org.eclipse.osbp.xtext.statemachine.services.StatemachineDSLGrammarAccess;
+import org.eclipse.xtext.common.types.JvmFormalParameter;
+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.XAssignment;
+import org.eclipse.xtext.xbase.XBasicForLoopExpression;
+import org.eclipse.xtext.xbase.XBinaryOperation;
+import org.eclipse.xtext.xbase.XBlockExpression;
+import org.eclipse.xtext.xbase.XBooleanLiteral;
+import org.eclipse.xtext.xbase.XCasePart;
+import org.eclipse.xtext.xbase.XCastedExpression;
+import org.eclipse.xtext.xbase.XCatchClause;
+import org.eclipse.xtext.xbase.XClosure;
+import org.eclipse.xtext.xbase.XConstructorCall;
+import org.eclipse.xtext.xbase.XDoWhileExpression;
+import org.eclipse.xtext.xbase.XFeatureCall;
+import org.eclipse.xtext.xbase.XForLoopExpression;
+import org.eclipse.xtext.xbase.XIfExpression;
+import org.eclipse.xtext.xbase.XInstanceOfExpression;
+import org.eclipse.xtext.xbase.XListLiteral;
+import org.eclipse.xtext.xbase.XMemberFeatureCall;
+import org.eclipse.xtext.xbase.XNullLiteral;
+import org.eclipse.xtext.xbase.XNumberLiteral;
+import org.eclipse.xtext.xbase.XPostfixOperation;
+import org.eclipse.xtext.xbase.XReturnExpression;
+import org.eclipse.xtext.xbase.XSetLiteral;
+import org.eclipse.xtext.xbase.XStringLiteral;
+import org.eclipse.xtext.xbase.XSwitchExpression;
+import org.eclipse.xtext.xbase.XSynchronizedExpression;
+import org.eclipse.xtext.xbase.XThrowExpression;
+import org.eclipse.xtext.xbase.XTryCatchFinallyExpression;
+import org.eclipse.xtext.xbase.XTypeLiteral;
+import org.eclipse.xtext.xbase.XUnaryOperation;
+import org.eclipse.xtext.xbase.XVariableDeclaration;
+import org.eclipse.xtext.xbase.XWhileExpression;
+import org.eclipse.xtext.xbase.XbasePackage;
+import org.eclipse.xtext.xbase.annotations.serializer.XbaseWithAnnotationsSemanticSequencer;
+import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation;
+import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationElementValuePair;
+import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage;
+import org.eclipse.xtext.xtype.XFunctionTypeRef;
+import org.eclipse.xtext.xtype.XImportDeclaration;
+import org.eclipse.xtext.xtype.XImportSection;
+import org.eclipse.xtext.xtype.XtypePackage;
+
+@SuppressWarnings("all")
+public class StatemachineDSLSemanticSequencer extends XbaseWithAnnotationsSemanticSequencer {
+
+	@Inject
+	private StatemachineDSLGrammarAccess grammarAccess;
+	
+	public void createSequence(EObject context, EObject semanticObject) {
+		if(semanticObject.eClass().getEPackage() == StatemachineDSLPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+			case StatemachineDSLPackage.STATEMACHINE:
+				if(context == grammarAccess.getStatemachineRule()) {
+					sequence_Statemachine(context, (Statemachine) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_CAPTION:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionButtonCaptionRule()) {
+					sequence_StatemachineActionButtonCaption(context, (StatemachineActionButtonCaption) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_BUTTON_IMAGE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionButtonImageRule()) {
+					sequence_StatemachineActionButtonImage(context, (StatemachineActionButtonImage) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionConditionalTransitionRule()) {
+					sequence_StatemachineActionConditionalTransition(context, (StatemachineActionConditionalTransition) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_DTO_FIND:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionDTOFindRule()) {
+					sequence_StatemachineActionDTOFind(context, (StatemachineActionDTOFind) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CLEAR:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionFieldClearRule()) {
+					sequence_StatemachineActionFieldClear(context, (StatemachineActionFieldClear) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_CONCATENATION:
+				if(context == grammarAccess.getStatemachineActionFieldConcatenationRule()) {
+					sequence_StatemachineActionFieldConcatenation(context, (StatemachineActionFieldConcatenation) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_GET:
+				if(context == grammarAccess.getStatemachineActionFieldGetMoreRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceMoreRule()) {
+					sequence_StatemachineActionFieldGetMore(context, (StatemachineActionFieldGet) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineActionFieldGetRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceRule()) {
+					sequence_StatemachineActionFieldGet(context, (StatemachineActionFieldGet) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_REMOVE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionFieldRemoveRule()) {
+					sequence_StatemachineActionFieldRemove(context, (StatemachineActionFieldRemove) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SET:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSetRule()) {
+					sequence_StatemachineActionFieldSet(context, (StatemachineActionFieldSet) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE:
+				if(context == grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceMoreRule()) {
+					sequence_StatemachineActionFieldSourceDtoAttributeMore(context, (StatemachineActionFieldSourceDtoAttribute) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceDtoAttributeRule()) {
+					sequence_StatemachineActionFieldSourceDtoAttribute(context, (StatemachineActionFieldSourceDtoAttribute) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE:
+				if(context == grammarAccess.getStatemachineActionFieldSourceEvaluateMoreRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceMoreRule()) {
+					sequence_StatemachineActionFieldSourceEvaluateMore(context, (StatemachineActionFieldSourceEvaluate) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceEvaluateRule()) {
+					sequence_StatemachineActionFieldSourceEvaluate(context, (StatemachineActionFieldSourceEvaluate) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_EVENT:
+				if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceEventRule()) {
+					sequence_StatemachineActionFieldSourceEvent(context, (StatemachineActionFieldSourceEvent) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER:
+				if(context == grammarAccess.getStatemachineActionFieldSourceMoreRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceNumberMoreRule()) {
+					sequence_StatemachineActionFieldSourceNumberMore(context, (StatemachineActionFieldSourceNumber) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceNumberRule()) {
+					sequence_StatemachineActionFieldSourceNumber(context, (StatemachineActionFieldSourceNumber) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_STRING:
+				if(context == grammarAccess.getStatemachineActionFieldSourceMoreRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceStringMoreRule()) {
+					sequence_StatemachineActionFieldSourceStringMore(context, (StatemachineActionFieldSourceString) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceStringRule()) {
+					sequence_StatemachineActionFieldSourceString(context, (StatemachineActionFieldSourceString) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE:
+				if(context == grammarAccess.getStatemachineActionFieldSourceMoreRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceTranslateMoreRule()) {
+					sequence_StatemachineActionFieldSourceTranslateMore(context, (StatemachineActionFieldSourceTranslate) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineActionFieldSourceTranslateRule()) {
+					sequence_StatemachineActionFieldSourceTranslate(context, (StatemachineActionFieldSourceTranslate) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_INVISIBLE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionItemInvisibleRule()) {
+					sequence_StatemachineActionItemInvisible(context, (StatemachineActionItemInvisible) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_ITEM_VISIBLE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionItemVisibleRule()) {
+					sequence_StatemachineActionItemVisible(context, (StatemachineActionItemVisible) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralBlinkRateRule()) {
+					sequence_StatemachineActionPeripheralBlinkRate(context, (StatemachineActionPeripheralBlinkRate) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CLEAR:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralClearRule()) {
+					sequence_StatemachineActionPeripheralClear(context, (StatemachineActionPeripheralClear) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralCreateWindowRule()) {
+					sequence_StatemachineActionPeripheralCreateWindow(context, (StatemachineActionPeripheralCreateWindow) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralCursorTypeRule()) {
+					sequence_StatemachineActionPeripheralCursorType(context, (StatemachineActionPeripheralCursorType) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralDestroyWindowRule()) {
+					sequence_StatemachineActionPeripheralDestroyWindow(context, (StatemachineActionPeripheralDestroyWindow) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule()) {
+					sequence_StatemachineActionPeripheralDeviceBrightness(context, (StatemachineActionPeripheralDeviceBrightness) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule()) {
+					sequence_StatemachineActionPeripheralDisplayBitmap(context, (StatemachineActionPeripheralDisplayBitmap) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralDisplayTextRule()) {
+					sequence_StatemachineActionPeripheralDisplayText(context, (StatemachineActionPeripheralDisplayText) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule()) {
+					sequence_StatemachineActionPeripheralDisplayTextAt(context, (StatemachineActionPeripheralDisplayTextAt) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule()) {
+					sequence_StatemachineActionPeripheralInterCharacterWait(context, (StatemachineActionPeripheralInterCharacterWait) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule()) {
+					sequence_StatemachineActionPeripheralMarqueeFormat(context, (StatemachineActionPeripheralMarqueeFormat) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule()) {
+					sequence_StatemachineActionPeripheralMarqueeRepeatWait(context, (StatemachineActionPeripheralMarqueeRepeatWait) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule()) {
+					sequence_StatemachineActionPeripheralMarqueeType(context, (StatemachineActionPeripheralMarqueeType) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule()) {
+					sequence_StatemachineActionPeripheralMarqueeUnitWait(context, (StatemachineActionPeripheralMarqueeUnitWait) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralOpenDrawerRule()) {
+					sequence_StatemachineActionPeripheralOpenDrawer(context, (StatemachineActionPeripheralOpenDrawer) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule()) {
+					sequence_StatemachineActionPeripheralPTAcknowledge(context, (StatemachineActionPeripheralPTAcknowledge) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule()) {
+					sequence_StatemachineActionPeripheralPTAuthorization(context, (StatemachineActionPeripheralPTAuthorization) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPTCloseRule()) {
+					sequence_StatemachineActionPeripheralPTClose(context, (StatemachineActionPeripheralPTClose) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPTOpenRule()) {
+					sequence_StatemachineActionPeripheralPTOpen(context, (StatemachineActionPeripheralPTOpen) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPTRegistrationRule()) {
+					sequence_StatemachineActionPeripheralPTRegistration(context, (StatemachineActionPeripheralPTRegistration) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE:
+				if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPTResponseRule()) {
+					sequence_StatemachineActionPeripheralPTResponse(context, (StatemachineActionPeripheralPTResponse) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPTReversalRule()) {
+					sequence_StatemachineActionPeripheralPTReversal(context, (StatemachineActionPeripheralPTReversal) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule()) {
+					sequence_StatemachineActionPeripheralPrintBarcode(context, (StatemachineActionPeripheralPrintBarcode) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPrintBitmapRule()) {
+					sequence_StatemachineActionPeripheralPrintBitmap(context, (StatemachineActionPeripheralPrintBitmap) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPrintCutRule()) {
+					sequence_StatemachineActionPeripheralPrintCut(context, (StatemachineActionPeripheralPrintCut) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPrintNormalRule()) {
+					sequence_StatemachineActionPeripheralPrintNormal(context, (StatemachineActionPeripheralPrintNormal) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule()) {
+					sequence_StatemachineActionPeripheralPrintRegisterBitmap(context, (StatemachineActionPeripheralPrintRegisterBitmap) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralPrintReportRule()) {
+					sequence_StatemachineActionPeripheralPrintReport(context, (StatemachineActionPeripheralPrintReport) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_PERIPHERAL_SCROLL:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionPeripheralScrollRule()) {
+					sequence_StatemachineActionPeripheralScroll(context, (StatemachineActionPeripheralScroll) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_ACTION_SCHEDULER:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineActionSchedulerRule()) {
+					sequence_StatemachineActionScheduler(context, (StatemachineActionScheduler) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON:
+				if(context == grammarAccess.getStatemachineControlRule() ||
+				   context == grammarAccess.getStatemachineControlButtonRule() ||
+				   context == grammarAccess.getStatemachineControlVisibilityRule()) {
+					sequence_StatemachineControlButton(context, (StatemachineControlButton) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE:
+				if(context == grammarAccess.getStatemachineControlButtonAttributeRule() ||
+				   context == grammarAccess.getStatemachineControlVisibilityRule()) {
+					sequence_StatemachineControlButtonAttribute(context, (StatemachineControlButtonAttribute) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT:
+				if(context == grammarAccess.getStatemachineControlButtonAttributeEventRule() ||
+				   context == grammarAccess.getStatemachineControlButtonAttributeEventEventRule()) {
+					sequence_StatemachineControlButtonAttributeEventEvent(context, (StatemachineControlButtonAttributeEventEvent) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY:
+				if(context == grammarAccess.getStatemachineControlButtonAttributeEventRule() ||
+				   context == grammarAccess.getStatemachineControlButtonAttributeEventIdentityRule()) {
+					sequence_StatemachineControlButtonAttributeEventIdentity(context, (StatemachineControlButtonAttributeEventIdentity) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD:
+				if(context == grammarAccess.getStatemachineControlButtonAttributeEventRule() ||
+				   context == grammarAccess.getStatemachineControlButtonAttributeEventKeyboardRule()) {
+					sequence_StatemachineControlButtonAttributeEventKeyboard(context, (StatemachineControlButtonAttributeEventKeyboard) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO:
+				if(context == grammarAccess.getStatemachineControlRule() ||
+				   context == grammarAccess.getStatemachineControlDTORule()) {
+					sequence_StatemachineControlDTO(context, (StatemachineControlDTO) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_DTO_ATTRIBUTE:
+				if(context == grammarAccess.getStatemachineControlDTOAttributeRule()) {
+					sequence_StatemachineControlDTOAttribute(context, (StatemachineControlDTOAttribute) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD:
+				if(context == grammarAccess.getStatemachineControlRule() ||
+				   context == grammarAccess.getStatemachineControlFieldRule()) {
+					sequence_StatemachineControlField(context, (StatemachineControlField) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE:
+				if(context == grammarAccess.getStatemachineControlFieldAttributeRule() ||
+				   context == grammarAccess.getStatemachineControlVisibilityRule()) {
+					sequence_StatemachineControlFieldAttribute(context, (StatemachineControlFieldAttribute) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_FIELD_LAYOUT:
+				if(context == grammarAccess.getStatemachineControlFieldLayoutRule() ||
+				   context == grammarAccess.getStatemachineControlVisibilityRule()) {
+					sequence_StatemachineControlFieldLayout(context, (StatemachineControlFieldLayout) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_PERIPHERAL:
+				if(context == grammarAccess.getStatemachineControlRule() ||
+				   context == grammarAccess.getStatemachineControlPeripheralRule()) {
+					sequence_StatemachineControlPeripheral(context, (StatemachineControlPeripheral) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER:
+				if(context == grammarAccess.getStatemachineControlRule() ||
+				   context == grammarAccess.getStatemachineControlSchedulerRule()) {
+					sequence_StatemachineControlScheduler(context, (StatemachineControlScheduler) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE:
+				if(context == grammarAccess.getStatemachineControlSchedulerAttributeRule()) {
+					sequence_StatemachineControlSchedulerAttribute(context, (StatemachineControlSchedulerAttribute) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_DTO_TYPE:
+				if(context == grammarAccess.getStatemachineDTOTypeRule()) {
+					sequence_StatemachineDTOType(context, (StatemachineDTOType) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_EVENT:
+				if(context == grammarAccess.getStatemachineEventRule()) {
+					sequence_StatemachineEvent(context, (StatemachineEvent) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_FIELD_TYPE:
+				if(context == grammarAccess.getStatemachineFieldTypeRule()) {
+					sequence_StatemachineFieldType(context, (StatemachineFieldType) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_FUNCTION:
+				if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineFunctionRule()) {
+					sequence_StatemachineFunction(context, (StatemachineFunction) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_GUARD:
+				if(context == grammarAccess.getStatemachineGuardRule()) {
+					sequence_StatemachineGuard(context, (StatemachineGuard) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_MODEL:
+				if(context == grammarAccess.getStatemachineModelRule()) {
+					sequence_StatemachineModel(context, (StatemachineModel) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION:
+				if(context == grammarAccess.getStatemachineActionFieldSourceMoreRule() ||
+				   context == grammarAccess.getStatemachineOperationMoreRule()) {
+					sequence_StatemachineOperationMore(context, (StatemachineOperation) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineOperationRule()) {
+					sequence_StatemachineOperation(context, (StatemachineOperation) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_OPERATION_PARAMETER:
+				if(context == grammarAccess.getStatemachineOperationParameterMoreRule()) {
+					sequence_StatemachineOperationParameterMore(context, (StatemachineOperationParameter) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineOperationParameterRule()) {
+					sequence_StatemachineOperationParameter(context, (StatemachineOperationParameter) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_PACKAGE:
+				if(context == grammarAccess.getStatemachinePackageRule()) {
+					sequence_StatemachinePackage(context, (StatemachinePackage) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_CASH_DRAWER:
+				if(context == grammarAccess.getStatemachinePeripheralDeviceCashDrawerRule()) {
+					sequence_StatemachinePeripheralDeviceCashDrawer(context, (StatemachinePeripheralDeviceCashDrawer) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_LINE_DISPLAY:
+				if(context == grammarAccess.getStatemachinePeripheralDeviceLineDisplayRule()) {
+					sequence_StatemachinePeripheralDeviceLineDisplay(context, (StatemachinePeripheralDeviceLineDisplay) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_POS_PRINTER:
+				if(context == grammarAccess.getStatemachinePeripheralDevicePOSPrinterRule()) {
+					sequence_StatemachinePeripheralDevicePOSPrinter(context, (StatemachinePeripheralDevicePOSPrinter) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_PERIPHERAL_DEVICE_PT:
+				if(context == grammarAccess.getStatemachinePeripheralDevicePTRule()) {
+					sequence_StatemachinePeripheralDevicePT(context, (StatemachinePeripheralDevicePT) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_STATE:
+				if(context == grammarAccess.getStatemachineStateRule()) {
+					sequence_StatemachineState(context, (StatemachineState) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE:
+				if(context == grammarAccess.getStatemachineActionRule() ||
+				   context == grammarAccess.getStatemachineStorageRule()) {
+					sequence_StatemachineStorage(context, (StatemachineStorage) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_STORAGE_RETRIEVE:
+				if(context == grammarAccess.getStatemachineActionFieldSourceMoreRule() ||
+				   context == grammarAccess.getStatemachineStorageRetrieveMoreRule()) {
+					sequence_StatemachineStorageRetrieveMore(context, (StatemachineStorageRetrieve) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getStatemachineActionFieldSourceRule() ||
+				   context == grammarAccess.getStatemachineStorageRetrieveRule()) {
+					sequence_StatemachineStorageRetrieve(context, (StatemachineStorageRetrieve) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachineDSLPackage.STATEMACHINE_TRIGGER:
+				if(context == grammarAccess.getStatemachineTriggerRule()) {
+					sequence_StatemachineTrigger(context, (StatemachineTrigger) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if(semanticObject.eClass().getEPackage() == OSBPTypesPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+			case OSBPTypesPackage.LIMPORT:
+				if(context == grammarAccess.getStatemachineImportRule()) {
+					sequence_StatemachineImport(context, (LImport) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if(semanticObject.eClass().getEPackage() == TypesPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+			case TypesPackage.JVM_FORMAL_PARAMETER:
+				if(context == grammarAccess.getFullJvmFormalParameterRule()) {
+					sequence_FullJvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getJvmFormalParameterRule()) {
+					sequence_JvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
+					return; 
+				}
+				else break;
+			case TypesPackage.JVM_GENERIC_ARRAY_TYPE_REFERENCE:
+				if(context == grammarAccess.getJvmArgumentTypeReferenceRule() ||
+				   context == grammarAccess.getJvmTypeReferenceRule() ||
+				   context == grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()) {
+					sequence_JvmTypeReference(context, (JvmGenericArrayTypeReference) semanticObject); 
+					return; 
+				}
+				else break;
+			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() == XAnnotationsPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+			case XAnnotationsPackage.XANNOTATION:
+				if(context == grammarAccess.getXAnnotationRule() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule()) {
+					sequence_XAnnotation(context, (XAnnotation) semanticObject); 
+					return; 
+				}
+				else break;
+			case XAnnotationsPackage.XANNOTATION_ELEMENT_VALUE_PAIR:
+				if(context == grammarAccess.getXAnnotationElementValuePairRule()) {
+					sequence_XAnnotationElementValuePair(context, (XAnnotationElementValuePair) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if(semanticObject.eClass().getEPackage() == XbasePackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+			case XbasePackage.XASSIGNMENT:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XAssignment_XMemberFeatureCall(context, (XAssignment) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XBASIC_FOR_LOOP_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXBasicForLoopExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XBasicForLoopExpression(context, (XBasicForLoopExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XBINARY_OPERATION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XAdditiveExpression_XAndExpression_XAssignment_XEqualityExpression_XMultiplicativeExpression_XOrExpression_XOtherOperatorExpression_XRelationalExpression(context, (XBinaryOperation) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XBLOCK_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXBlockExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XBlockExpression(context, (XBlockExpression) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getXExpressionInClosureRule()) {
+					sequence_XExpressionInClosure(context, (XBlockExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XBOOLEAN_LITERAL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXBooleanLiteralRule() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXLiteralRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XBooleanLiteral(context, (XBooleanLiteral) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XCASE_PART:
+				if(context == grammarAccess.getXCasePartRule()) {
+					sequence_XCasePart(context, (XCasePart) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XCASTED_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XCastedExpression(context, (XCastedExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XCATCH_CLAUSE:
+				if(context == grammarAccess.getXCatchClauseRule()) {
+					sequence_XCatchClause(context, (XCatchClause) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XCLOSURE:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXClosureRule() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXLiteralRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XClosure(context, (XClosure) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getXShortClosureRule()) {
+					sequence_XShortClosure(context, (XClosure) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XCONSTRUCTOR_CALL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXConstructorCallRule() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XConstructorCall(context, (XConstructorCall) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XDO_WHILE_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXDoWhileExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XDoWhileExpression(context, (XDoWhileExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XFEATURE_CALL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XFeatureCall(context, (XFeatureCall) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XFOR_LOOP_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXForLoopExpressionRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XForLoopExpression(context, (XForLoopExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XIF_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXIfExpressionRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XIfExpression(context, (XIfExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XINSTANCE_OF_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XRelationalExpression(context, (XInstanceOfExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XLIST_LITERAL:
+				if(context == grammarAccess.getXAnnotationElementValueOrCommaListRule()) {
+					sequence_XAnnotationElementValueOrCommaList_XListLiteral(context, (XListLiteral) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getXAnnotationElementValueRule()) {
+					sequence_XAnnotationElementValue_XListLiteral(context, (XListLiteral) semanticObject); 
+					return; 
+				}
+				else if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXCollectionLiteralRule() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXListLiteralRule() ||
+				   context == grammarAccess.getXLiteralRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XListLiteral(context, (XListLiteral) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XMEMBER_FEATURE_CALL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XMemberFeatureCall(context, (XMemberFeatureCall) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XNULL_LITERAL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXLiteralRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXNullLiteralRule() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XNullLiteral(context, (XNullLiteral) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XNUMBER_LITERAL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXLiteralRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXNumberLiteralRule() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XNumberLiteral(context, (XNumberLiteral) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XPOSTFIX_OPERATION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XPostfixOperation(context, (XPostfixOperation) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XRETURN_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXReturnExpressionRule() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XReturnExpression(context, (XReturnExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XSET_LITERAL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXCollectionLiteralRule() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXLiteralRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXSetLiteralRule() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XSetLiteral(context, (XSetLiteral) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XSTRING_LITERAL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXLiteralRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXStringLiteralRule() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XStringLiteral(context, (XStringLiteral) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XSWITCH_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXSwitchExpressionRule() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XSwitchExpression(context, (XSwitchExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XSYNCHRONIZED_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXSynchronizedExpressionRule() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XSynchronizedExpression(context, (XSynchronizedExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XTHROW_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXThrowExpressionRule() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XThrowExpression(context, (XThrowExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XTRY_CATCH_FINALLY_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXTryCatchFinallyExpressionRule() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XTryCatchFinallyExpression(context, (XTryCatchFinallyExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XTYPE_LITERAL:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXLiteralRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXTypeLiteralRule() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XTypeLiteral(context, (XTypeLiteral) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XUNARY_OPERATION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule()) {
+					sequence_XUnaryOperation(context, (XUnaryOperation) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XVARIABLE_DECLARATION:
+				if(context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXVariableDeclarationRule()) {
+					sequence_XVariableDeclaration(context, (XVariableDeclaration) semanticObject); 
+					return; 
+				}
+				else break;
+			case XbasePackage.XWHILE_EXPRESSION:
+				if(context == grammarAccess.getXAdditiveExpressionRule() ||
+				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAndExpressionRule() ||
+				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXAnnotationElementValueRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
+				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
+				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
+				   context == grammarAccess.getXAssignmentRule() ||
+				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXCastedExpressionRule() ||
+				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
+				   context == grammarAccess.getXEqualityExpressionRule() ||
+				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXExpressionRule() ||
+				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
+				   context == grammarAccess.getXMemberFeatureCallRule() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
+				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOrExpressionRule() ||
+				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
+				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
+				   context == grammarAccess.getXParenthesizedExpressionRule() ||
+				   context == grammarAccess.getXPostfixOperationRule() ||
+				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
+				   context == grammarAccess.getXPrimaryExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionRule() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
+				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
+				   context == grammarAccess.getXUnaryOperationRule() ||
+				   context == grammarAccess.getXWhileExpressionRule()) {
+					sequence_XWhileExpression(context, (XWhileExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		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:
+	 *     (caption=StatemachineActionFieldConcatenation attribute=[StatemachineControlButtonAttribute|ID])
+	 */
+	protected void sequence_StatemachineActionButtonCaption(EObject context, StatemachineActionButtonCaption semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_CAPTION__CAPTION));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionButtonCaptionAccess().getCaptionStatemachineActionFieldConcatenationParserRuleCall_1_0(), semanticObject.getCaption());
+		feeder.accept(grammarAccess.getStatemachineActionButtonCaptionAccess().getAttributeStatemachineControlButtonAttributeIDTerminalRuleCall_3_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (image=STRING attribute=[StatemachineControlButtonAttribute|ID])
+	 */
+	protected void sequence_StatemachineActionButtonImage(EObject context, StatemachineActionButtonImage semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_IMAGE__IMAGE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionButtonImageAccess().getImageSTRINGTerminalRuleCall_1_0(), semanticObject.getImage());
+		feeder.accept(grammarAccess.getStatemachineActionButtonImageAccess().getAttributeStatemachineControlButtonAttributeIDTerminalRuleCall_3_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (transition=[StatemachineState|ID] guard=StatemachineGuard actions+=StatemachineAction*)
+	 */
+	protected void sequence_StatemachineActionConditionalTransition(EObject context, StatemachineActionConditionalTransition semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (search=StatemachineActionFieldConcatenation dto=[StatemachineControlDTOAttribute|ID] attribute=[LDtoInheritedAttribute|ID])
+	 */
+	protected void sequence_StatemachineActionDTOFind(EObject context, StatemachineActionDTOFind semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__DTO) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__DTO));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__SEARCH) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__SEARCH));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionDTOFindAccess().getSearchStatemachineActionFieldConcatenationParserRuleCall_1_0(), semanticObject.getSearch());
+		feeder.accept(grammarAccess.getStatemachineActionDTOFindAccess().getDtoStatemachineControlDTOAttributeIDTerminalRuleCall_3_0_1(), semanticObject.getDto());
+		feeder.accept(grammarAccess.getStatemachineActionDTOFindAccess().getAttributeLDtoInheritedAttributeIDTerminalRuleCall_5_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     attribute=[StatemachineControlFieldAttribute|ID]
+	 */
+	protected void sequence_StatemachineActionFieldClear(EObject context, StatemachineActionFieldClear semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldClearAccess().getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (first=StatemachineActionFieldSource more+=StatemachineActionFieldSourceMore*)
+	 */
+	protected void sequence_StatemachineActionFieldConcatenation(EObject context, StatemachineActionFieldConcatenation semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     attribute=[StatemachineControlFieldAttribute|ID]
+	 */
+	protected void sequence_StatemachineActionFieldGetMore(EObject context, StatemachineActionFieldGet semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldGetMoreAccess().getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_3_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     attribute=[StatemachineControlFieldAttribute|ID]
+	 */
+	protected void sequence_StatemachineActionFieldGet(EObject context, StatemachineActionFieldGet semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldGetAccess().getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     attribute=[StatemachineControlFieldAttribute|ID]
+	 */
+	protected void sequence_StatemachineActionFieldRemove(EObject context, StatemachineActionFieldRemove semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldRemoveAccess().getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (source=StatemachineActionFieldConcatenation attribute=[StatemachineControlFieldAttribute|ID])
+	 */
+	protected void sequence_StatemachineActionFieldSet(EObject context, StatemachineActionFieldSet semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SET__SOURCE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SET__SOURCE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSetAccess().getSourceStatemachineActionFieldConcatenationParserRuleCall_1_0(), semanticObject.getSource());
+		feeder.accept(grammarAccess.getStatemachineActionFieldSetAccess().getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_3_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (dto=[StatemachineControlDTOAttribute|ID] attribute=[LDtoInheritedAttribute|ID])
+	 */
+	protected void sequence_StatemachineActionFieldSourceDtoAttributeMore(EObject context, StatemachineActionFieldSourceDtoAttribute semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getDtoStatemachineControlDTOAttributeIDTerminalRuleCall_3_0_1(), semanticObject.getDto());
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getAttributeLDtoInheritedAttributeIDTerminalRuleCall_5_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (dto=[StatemachineControlDTOAttribute|ID] attribute=[LDtoInheritedAttribute|ID])
+	 */
+	protected void sequence_StatemachineActionFieldSourceDtoAttribute(EObject context, StatemachineActionFieldSourceDtoAttribute semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getDtoStatemachineControlDTOAttributeIDTerminalRuleCall_1_0_1(), semanticObject.getDto());
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getAttributeLDtoInheritedAttributeIDTerminalRuleCall_3_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     evaluationtype=StatemachineEvaluationType
+	 */
+	protected void sequence_StatemachineActionFieldSourceEvaluateMore(EObject context, StatemachineActionFieldSourceEvaluate semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_2_0(), semanticObject.getEvaluationtype());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     evaluationtype=StatemachineEvaluationType
+	 */
+	protected void sequence_StatemachineActionFieldSourceEvaluate(EObject context, StatemachineActionFieldSourceEvaluate semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_EVALUATE__EVALUATIONTYPE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceEvaluateAccess().getEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_0(), semanticObject.getEvaluationtype());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     {StatemachineActionFieldSourceEvent}
+	 */
+	protected void sequence_StatemachineActionFieldSourceEvent(EObject context, StatemachineActionFieldSourceEvent semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     value=SignedNumber
+	 */
+	protected void sequence_StatemachineActionFieldSourceNumberMore(EObject context, StatemachineActionFieldSourceNumber semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getValueSignedNumberParserRuleCall_2_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     value=SignedNumber
+	 */
+	protected void sequence_StatemachineActionFieldSourceNumber(EObject context, StatemachineActionFieldSourceNumber semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_NUMBER__VALUE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceNumberAccess().getValueSignedNumberParserRuleCall_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     text=STRING
+	 */
+	protected void sequence_StatemachineActionFieldSourceStringMore(EObject context, StatemachineActionFieldSourceString semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getTextSTRINGTerminalRuleCall_2_0(), semanticObject.getText());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     text=STRING
+	 */
+	protected void sequence_StatemachineActionFieldSourceString(EObject context, StatemachineActionFieldSourceString semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_STRING__TEXT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceStringAccess().getTextSTRINGTerminalRuleCall_0(), semanticObject.getText());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     text=TRANSLATABLESTRING
+	 */
+	protected void sequence_StatemachineActionFieldSourceTranslateMore(EObject context, StatemachineActionFieldSourceTranslate semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getTextTRANSLATABLESTRINGParserRuleCall_3_0(), semanticObject.getText());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     text=TRANSLATABLESTRING
+	 */
+	protected void sequence_StatemachineActionFieldSourceTranslate(EObject context, StatemachineActionFieldSourceTranslate semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_TRANSLATE__TEXT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getTextTRANSLATABLESTRINGParserRuleCall_1_0(), semanticObject.getText());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     attribute=[StatemachineControlVisibility|ID]
+	 */
+	protected void sequence_StatemachineActionItemInvisible(EObject context, StatemachineActionItemInvisible semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionItemInvisibleAccess().getAttributeStatemachineControlVisibilityIDTerminalRuleCall_1_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     attribute=[StatemachineControlVisibility|ID]
+	 */
+	protected void sequence_StatemachineActionItemVisible(EObject context, StatemachineActionItemVisible semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionItemVisibleAccess().getAttributeStatemachineControlVisibilityIDTerminalRuleCall_1_0_1(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (blinkRate=INT device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralBlinkRate(EObject context, StatemachineActionPeripheralBlinkRate semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__BLINK_RATE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateINTTerminalRuleCall_1_0(), semanticObject.getBlinkRate());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     device=[StatemachinePeripheralDeviceLineDisplay|ID]
+	 */
+	protected void sequence_StatemachineActionPeripheralClear(EObject context, StatemachineActionPeripheralClear semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralClearAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_1_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (
+	 *         viewportRow=INT 
+	 *         viewportColumn=INT 
+	 *         viewportHeight=INT 
+	 *         viewportWidth=INT 
+	 *         windowHeight=INT 
+	 *         windowWidth=INT 
+	 *         device=[StatemachinePeripheralDeviceLineDisplay|ID]
+	 *     )
+	 */
+	protected void sequence_StatemachineActionPeripheralCreateWindow(EObject context, StatemachineActionPeripheralCreateWindow semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_ROW));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_COLUMN));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_HEIGHT));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__VIEWPORT_WIDTH));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_HEIGHT));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__WINDOW_WIDTH));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportRowINTTerminalRuleCall_2_0(), semanticObject.getViewportRow());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportColumnINTTerminalRuleCall_4_0(), semanticObject.getViewportColumn());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportHeightINTTerminalRuleCall_6_0(), semanticObject.getViewportHeight());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getViewportWidthINTTerminalRuleCall_8_0(), semanticObject.getViewportWidth());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowHeightINTTerminalRuleCall_10_0(), semanticObject.getWindowHeight());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getWindowWidthINTTerminalRuleCall_12_0(), semanticObject.getWindowWidth());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_14_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (cursorType=StatemachineLineDisplayCursorType device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralCursorType(EObject context, StatemachineActionPeripheralCursorType semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__CURSOR_TYPE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getCursorTypeStatemachineLineDisplayCursorTypeEnumRuleCall_1_0(), semanticObject.getCursorType());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     device=[StatemachinePeripheralDeviceLineDisplay|ID]
+	 */
+	protected void sequence_StatemachineActionPeripheralDestroyWindow(EObject context, StatemachineActionPeripheralDestroyWindow semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_1_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (brightness=INT device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralDeviceBrightness(EObject context, StatemachineActionPeripheralDeviceBrightness semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__BRIGHTNESS));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getBrightnessINTTerminalRuleCall_1_0(), semanticObject.getBrightness());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (bitmapId=INT device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralDisplayBitmap(EObject context, StatemachineActionPeripheralDisplayBitmap semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__BITMAP_ID));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0(), semanticObject.getBitmapId());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_4_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (
+	 *         text=StatemachineActionFieldConcatenation 
+	 *         row=INT 
+	 *         column=INT 
+	 *         (hasType?='type' textType=StatemachineLineDisplayTextType)? 
+	 *         device=[StatemachinePeripheralDeviceLineDisplay|ID]
+	 *     )
+	 */
+	protected void sequence_StatemachineActionPeripheralDisplayTextAt(EObject context, StatemachineActionPeripheralDisplayTextAt semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (
+	 *         text=StatemachineActionFieldConcatenation 
+	 *         (hasType?='type' textType=StatemachineLineDisplayTextType)? 
+	 *         device=[StatemachinePeripheralDeviceLineDisplay|ID]
+	 *     )
+	 */
+	protected void sequence_StatemachineActionPeripheralDisplayText(EObject context, StatemachineActionPeripheralDisplayText semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (wait=INT device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralInterCharacterWait(EObject context, StatemachineActionPeripheralInterCharacterWait semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__WAIT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getWaitINTTerminalRuleCall_1_0(), semanticObject.getWait());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (format=StatemachineLineDisplayMarqueeFormat device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralMarqueeFormat(EObject context, StatemachineActionPeripheralMarqueeFormat semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__FORMAT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getFormatStatemachineLineDisplayMarqueeFormatEnumRuleCall_1_0(), semanticObject.getFormat());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (wait=INT device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralMarqueeRepeatWait(EObject context, StatemachineActionPeripheralMarqueeRepeatWait semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__WAIT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getWaitINTTerminalRuleCall_1_0(), semanticObject.getWait());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (marqueeType=StatemachineLineDisplayMarqueeType device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralMarqueeType(EObject context, StatemachineActionPeripheralMarqueeType semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__MARQUEE_TYPE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getMarqueeTypeStatemachineLineDisplayMarqueeTypeEnumRuleCall_1_0(), semanticObject.getMarqueeType());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (wait=INT device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralMarqueeUnitWait(EObject context, StatemachineActionPeripheralMarqueeUnitWait semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__WAIT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getWaitINTTerminalRuleCall_1_0(), semanticObject.getWait());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     device=[StatemachinePeripheralDeviceCashDrawer|ID]
+	 */
+	protected void sequence_StatemachineActionPeripheralOpenDrawer(EObject context, StatemachineActionPeripheralOpenDrawer semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getDeviceStatemachinePeripheralDeviceCashDrawerIDTerminalRuleCall_1_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     device=[StatemachinePeripheralDevicePT|ID]
+	 */
+	protected void sequence_StatemachineActionPeripheralPTAcknowledge(EObject context, StatemachineActionPeripheralPTAcknowledge semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (amount=StatemachineActionFieldConcatenation device=[StatemachinePeripheralDevicePT|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPTAuthorization(EObject context, StatemachineActionPeripheralPTAuthorization semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__AMOUNT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getAmountStatemachineActionFieldConcatenationParserRuleCall_2_0(), semanticObject.getAmount());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_4_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     device=[StatemachinePeripheralDevicePT|ID]
+	 */
+	protected void sequence_StatemachineActionPeripheralPTClose(EObject context, StatemachineActionPeripheralPTClose semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (host=StatemachineActionFieldConcatenation port=StatemachineActionFieldConcatenation device=[StatemachinePeripheralDevicePT|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPTOpen(EObject context, StatemachineActionPeripheralPTOpen semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__HOST));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__PORT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getHostStatemachineActionFieldConcatenationParserRuleCall_2_0(), semanticObject.getHost());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getPortStatemachineActionFieldConcatenationParserRuleCall_4_0(), semanticObject.getPort());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (password=StatemachineActionFieldConcatenation configuration=STRING device=[StatemachinePeripheralDevicePT|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPTRegistration(EObject context, StatemachineActionPeripheralPTRegistration semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__PASSWORD));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__CONFIGURATION));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0(), semanticObject.getPassword());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getConfigurationSTRINGTerminalRuleCall_4_0(), semanticObject.getConfiguration());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     device=[StatemachinePeripheralDevicePT|ID]
+	 */
+	protected void sequence_StatemachineActionPeripheralPTResponse(EObject context, StatemachineActionPeripheralPTResponse semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (password=StatemachineActionFieldConcatenation receipt=StatemachineActionFieldConcatenation device=[StatemachinePeripheralDevicePT|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPTReversal(EObject context, StatemachineActionPeripheralPTReversal semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__PASSWORD));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__RECEIPT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0(), semanticObject.getPassword());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getReceiptStatemachineActionFieldConcatenationParserRuleCall_4_0(), semanticObject.getReceipt());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (data=STRING barcodeType=StatemachinePOSPrinterBarcodeType device=[StatemachinePeripheralDevicePOSPrinter|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPrintBarcode(EObject context, StatemachineActionPeripheralPrintBarcode semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DATA));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__BARCODE_TYPE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDataSTRINGTerminalRuleCall_2_0(), semanticObject.getData());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getBarcodeTypeStatemachinePOSPrinterBarcodeTypeEnumRuleCall_4_0(), semanticObject.getBarcodeType());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_6_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (bitmapId=INT device=[StatemachinePeripheralDevicePOSPrinter|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPrintBitmap(EObject context, StatemachineActionPeripheralPrintBitmap semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__BITMAP_ID));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0(), semanticObject.getBitmapId());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (text=StatemachineActionFieldConcatenation device=[StatemachinePeripheralDevicePOSPrinter|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPrintCut(EObject context, StatemachineActionPeripheralPrintCut semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__TEXT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getTextStatemachineActionFieldConcatenationParserRuleCall_2_0(), semanticObject.getText());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (text=StatemachineActionFieldConcatenation device=[StatemachinePeripheralDevicePOSPrinter|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPrintNormal(EObject context, StatemachineActionPeripheralPrintNormal semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (bitmapId=INT name=STRING device=[StatemachinePeripheralDevicePOSPrinter|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralPrintRegisterBitmap(EObject context, StatemachineActionPeripheralPrintRegisterBitmap semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__BITMAP_ID));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__NAME));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0(), semanticObject.getBitmapId());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getNameSTRINGTerminalRuleCall_4_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_6_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (report=[Report|ID] (hasFilter?='from' key=[StatemachineStorage|ID])?)
+	 */
+	protected void sequence_StatemachineActionPeripheralPrintReport(EObject context, StatemachineActionPeripheralPrintReport semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (direction=StatemachineLineDisplayScrollTextType units=INT device=[StatemachinePeripheralDeviceLineDisplay|ID])
+	 */
+	protected void sequence_StatemachineActionPeripheralScroll(EObject context, StatemachineActionPeripheralScroll semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DIRECTION));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__UNITS));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralScrollAccess().getDirectionStatemachineLineDisplayScrollTextTypeEnumRuleCall_1_0(), semanticObject.getDirection());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralScrollAccess().getUnitsINTTerminalRuleCall_2_0(), semanticObject.getUnits());
+		feeder.accept(grammarAccess.getStatemachineActionPeripheralScrollAccess().getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_4_0_1(), semanticObject.getDevice());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     scheduler=[StatemachineControlSchedulerAttribute|ID]
+	 */
+	protected void sequence_StatemachineActionScheduler(EObject context, StatemachineActionScheduler semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineActionSchedulerAccess().getSchedulerStatemachineControlSchedulerAttributeIDTerminalRuleCall_1_0_1(), semanticObject.getScheduler());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     event=[StatemachineEvent|ID]
+	 */
+	protected void sequence_StatemachineControlButtonAttributeEventEvent(EObject context, StatemachineControlButtonAttributeEventEvent semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT__EVENT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getEventStatemachineEventIDTerminalRuleCall_2_0_1(), semanticObject.getEvent());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     identity=INT
+	 */
+	protected void sequence_StatemachineControlButtonAttributeEventIdentity(EObject context, StatemachineControlButtonAttributeEventIdentity semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY__IDENTITY));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getIdentityINTTerminalRuleCall_2_0(), semanticObject.getIdentity());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     keystroke=STRING
+	 */
+	protected void sequence_StatemachineControlButtonAttributeEventKeyboard(EObject context, StatemachineControlButtonAttributeEventKeyboard semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD__KEYSTROKE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getKeystrokeSTRINGTerminalRuleCall_2_0(), semanticObject.getKeystroke());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=TRANSLATABLEID (hasImage?='image' image=STRING)? event=StatemachineControlButtonAttributeEvent)
+	 */
+	protected void sequence_StatemachineControlButtonAttribute(EObject context, StatemachineControlButtonAttribute semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=ID eventType=StatemachineControlButtonEventType buttons+=StatemachineControlButtonAttribute*)
+	 */
+	protected void sequence_StatemachineControlButton(EObject context, StatemachineControlButton semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=ID attributeType=StatemachineDTOType (hasEvent?='event' event=[StatemachineEvent|ID])?)
+	 */
+	protected void sequence_StatemachineControlDTOAttribute(EObject context, StatemachineControlDTOAttribute semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=ID dtos+=StatemachineControlDTOAttribute*)
+	 */
+	protected void sequence_StatemachineControlDTO(EObject context, StatemachineControlDTO semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=TRANSLATABLEID attributeType=StatemachineFieldType)
+	 */
+	protected void sequence_StatemachineControlFieldAttribute(EObject context, StatemachineControlFieldAttribute semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_FIELD_ATTRIBUTE__ATTRIBUTE_TYPE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineControlFieldAttributeAccess().getNameTRANSLATABLEIDParserRuleCall_1_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getStatemachineControlFieldAttributeAccess().getAttributeTypeStatemachineFieldTypeParserRuleCall_3_0(), semanticObject.getAttributeType());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     name=ID
+	 */
+	protected void sequence_StatemachineControlFieldLayout(EObject context, StatemachineControlFieldLayout semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineControlFieldLayoutAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=ID fields+=StatemachineControlFieldAttribute* layouts+=StatemachineControlFieldLayout*)
+	 */
+	protected void sequence_StatemachineControlField(EObject context, StatemachineControlField semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (
+	 *         name=ID 
+	 *         lineDisplays+=StatemachinePeripheralDeviceLineDisplay* 
+	 *         posPrinters+=StatemachinePeripheralDevicePOSPrinter* 
+	 *         cashDrawers+=StatemachinePeripheralDeviceCashDrawer* 
+	 *         paymentTerminals+=StatemachinePeripheralDevicePT*
+	 *     )
+	 */
+	protected void sequence_StatemachineControlPeripheral(EObject context, StatemachineControlPeripheral semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=ID delay=INT event=[StatemachineEvent|ID])
+	 */
+	protected void sequence_StatemachineControlSchedulerAttribute(EObject context, StatemachineControlSchedulerAttribute semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__DELAY));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_CONTROL_SCHEDULER_ATTRIBUTE__EVENT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getDelayINTTerminalRuleCall_3_0(), semanticObject.getDelay());
+		feeder.accept(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getEventStatemachineEventIDTerminalRuleCall_5_0_1(), semanticObject.getEvent());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=ID schedulers+=StatemachineControlSchedulerAttribute*)
+	 */
+	protected void sequence_StatemachineControlScheduler(EObject context, StatemachineControlScheduler semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     attributeType=[LDto|ID]
+	 */
+	protected void sequence_StatemachineDTOType(EObject context, StatemachineDTOType semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_DTO_TYPE__ATTRIBUTE_TYPE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineDTOTypeAccess().getAttributeTypeLDtoIDTerminalRuleCall_0_1(), semanticObject.getAttributeType());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     name=ID
+	 */
+	protected void sequence_StatemachineEvent(EObject context, StatemachineEvent semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineEventAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     attributeType=StatemachineInternalType
+	 */
+	protected void sequence_StatemachineFieldType(EObject context, StatemachineFieldType semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_FIELD_TYPE__ATTRIBUTE_TYPE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineFieldTypeAccess().getAttributeTypeStatemachineInternalTypeEnumRuleCall_0(), semanticObject.getAttributeType());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (function=[FunctionLibraryFunction|ID] first=StatemachineOperationParameter? more+=StatemachineOperationParameterMore*)
+	 */
+	protected void sequence_StatemachineFunction(EObject context, StatemachineFunction semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (
+	 *         guard=[FunctionLibraryGuard|ID] 
+	 *         (hasOnFail?='onFail' onFailCaption=TRANSLATABLESTRING onFailDescription=TRANSLATABLESTRING onFailType=StatemachineUserMessageType)?
+	 *     )
+	 */
+	protected void sequence_StatemachineGuard(EObject context, StatemachineGuard semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     importedNamespace=StatemachineQualifiedNameWithWildCard
+	 */
+	protected void sequence_StatemachineImport(EObject context, LImport semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, OSBPTypesPackage.Literals.LIMPORT__IMPORTED_NAMESPACE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, OSBPTypesPackage.Literals.LIMPORT__IMPORTED_NAMESPACE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineImportAccess().getImportedNamespaceStatemachineQualifiedNameWithWildCardParserRuleCall_1_0(), semanticObject.getImportedNamespace());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     packages+=StatemachinePackage*
+	 */
+	protected void sequence_StatemachineModel(EObject context, StatemachineModel semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     operation=[FunctionLibraryOperation|ID]
+	 */
+	protected void sequence_StatemachineOperationMore(EObject context, StatemachineOperation semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     source=StatemachineActionFieldConcatenation
+	 */
+	protected void sequence_StatemachineOperationParameterMore(EObject context, StatemachineOperationParameter semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_OPERATION_PARAMETER__SOURCE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_OPERATION_PARAMETER__SOURCE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineOperationParameterMoreAccess().getSourceStatemachineActionFieldConcatenationParserRuleCall_2_0(), semanticObject.getSource());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     source=StatemachineActionFieldConcatenation
+	 */
+	protected void sequence_StatemachineOperationParameter(EObject context, StatemachineOperationParameter semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_OPERATION_PARAMETER__SOURCE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_OPERATION_PARAMETER__SOURCE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineOperationParameterAccess().getSourceStatemachineActionFieldConcatenationParserRuleCall_0(), semanticObject.getSource());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (operation=[FunctionLibraryOperation|ID] first=StatemachineOperationParameter? more+=StatemachineOperationParameterMore*)
+	 */
+	protected void sequence_StatemachineOperation(EObject context, StatemachineOperation semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (name=QualifiedName (imports+=StatemachineImport* statemachines+=Statemachine*)?)
+	 */
+	protected void sequence_StatemachinePackage(EObject context, StatemachinePackage semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     name=ID
+	 */
+	protected void sequence_StatemachinePeripheralDeviceCashDrawer(EObject context, StatemachinePeripheralDeviceCashDrawer semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     name=ID
+	 */
+	protected void sequence_StatemachinePeripheralDeviceLineDisplay(EObject context, StatemachinePeripheralDeviceLineDisplay semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     name=ID
+	 */
+	protected void sequence_StatemachinePeripheralDevicePOSPrinter(EObject context, StatemachinePeripheralDevicePOSPrinter semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     name=ID
+	 */
+	protected void sequence_StatemachinePeripheralDevicePT(EObject context, StatemachinePeripheralDevicePT semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_BASE__NAME));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachinePeripheralDevicePTAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (
+	 *         name=ID 
+	 *         triggers+=StatemachineTrigger* 
+	 *         identity=StatemachineOperation? 
+	 *         (keystroke=[StatemachineControlFieldAttribute|ID] (hasKeyOperation?='and' keyOperation=StatemachineOperation)?)?
+	 *     )
+	 */
+	protected void sequence_StatemachineState(EObject context, StatemachineState semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (key=ID attribute=ID)
+	 */
+	protected void sequence_StatemachineStorageRetrieveMore(EObject context, StatemachineStorageRetrieve semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__KEY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__KEY));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getKeyIDTerminalRuleCall_4_0(), semanticObject.getKey());
+		feeder.accept(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getAttributeIDTerminalRuleCall_6_0(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (key=ID attribute=ID)
+	 */
+	protected void sequence_StatemachineStorageRetrieve(EObject context, StatemachineStorageRetrieve semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__KEY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__KEY));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineStorageRetrieveAccess().getKeyIDTerminalRuleCall_2_0(), semanticObject.getKey());
+		feeder.accept(grammarAccess.getStatemachineStorageRetrieveAccess().getAttributeIDTerminalRuleCall_4_0(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (content=StatemachineActionFieldConcatenation key=ID attribute=ID)
+	 */
+	protected void sequence_StatemachineStorage(EObject context, StatemachineStorage semanticObject) {
+		if(errorAcceptor != null) {
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE__KEY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE__KEY));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE__ATTRIBUTE));
+			if(transientValues.isValueTransient(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE__CONTENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE__CONTENT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getStatemachineStorageAccess().getContentStatemachineActionFieldConcatenationParserRuleCall_1_0(), semanticObject.getContent());
+		feeder.accept(grammarAccess.getStatemachineStorageAccess().getKeyIDTerminalRuleCall_3_0(), semanticObject.getKey());
+		feeder.accept(grammarAccess.getStatemachineStorageAccess().getAttributeIDTerminalRuleCall_5_0(), semanticObject.getAttribute());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (
+	 *         triggers+=[StatemachineEvent|ID]* 
+	 *         guards+=StatemachineGuard* 
+	 *         (hasTransition?='transition' transition=[StatemachineState|ID])? 
+	 *         actions+=StatemachineAction*
+	 *     )
+	 */
+	protected void sequence_StatemachineTrigger(EObject context, StatemachineTrigger semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (
+	 *         name=ID 
+	 *         (description?='described by' descriptionValue=TRANSLATABLESTRING)? 
+	 *         functionGroup=[FunctionLibraryStatemachineGroup|ID]? 
+	 *         initialState=[StatemachineState|ID] 
+	 *         initialEvent=[StatemachineEvent|ID] 
+	 *         events+=StatemachineEvent* 
+	 *         controls+=StatemachineControl* 
+	 *         states+=StatemachineState*
+	 *     )
+	 */
+	protected void sequence_Statemachine(EObject context, Statemachine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/serializer/StatemachineDSLSyntacticSequencer.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/serializer/StatemachineDSLSyntacticSequencer.java
new file mode 100644
index 0000000..0ae6b4d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/serializer/StatemachineDSLSyntacticSequencer.java
@@ -0,0 +1,213 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.serializer;
+
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.xtext.statemachine.services.StatemachineDSLGrammarAccess;
+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 StatemachineDSLSyntacticSequencer extends AbstractSyntacticSequencer {
+
+	protected StatemachineDSLGrammarAccess grammarAccess;
+	protected AbstractElementAlias match_StatemachinePackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_3__q;
+	protected AbstractElementAlias match_StatemachineState___RightCurlyBracketKeyword_3_0_3_TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1__a;
+	protected AbstractElementAlias match_StatemachineState___TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1_RightCurlyBracketKeyword_3_0_3__a;
+	protected AbstractElementAlias match_StatemachineTrigger___GuardsKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__q;
+	protected AbstractElementAlias match_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q;
+	protected AbstractElementAlias match_XBlockExpression_SemicolonKeyword_2_1_q;
+	protected AbstractElementAlias match_XExpressionInClosure_SemicolonKeyword_1_1_q;
+	protected AbstractElementAlias match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q;
+	protected AbstractElementAlias match_XImportDeclaration_SemicolonKeyword_2_q;
+	protected AbstractElementAlias match_XParenthesizedExpression_LeftParenthesisKeyword_0_a;
+	protected AbstractElementAlias match_XParenthesizedExpression_LeftParenthesisKeyword_0_p;
+	
+	@Inject
+	protected void init(IGrammarAccess access) {
+		grammarAccess = (StatemachineDSLGrammarAccess) access;
+		match_StatemachinePackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachinePackageAccess().getLeftCurlyBracketKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachinePackageAccess().getRightCurlyBracketKeyword_3_3()));
+		match_StatemachineState___RightCurlyBracketKeyword_3_0_3_TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1__a = new GroupAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_3_0_3()), new TokenAlias(false, false, grammarAccess.getStatemachineStateAccess().getTriggersKeyword_3_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_3_0_1()));
+		match_StatemachineState___TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1_RightCurlyBracketKeyword_3_0_3__a = new GroupAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineStateAccess().getTriggersKeyword_3_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_3_0_1()), new TokenAlias(false, false, grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_3_0_3()));
+		match_StatemachineTrigger___GuardsKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineTriggerAccess().getGuardsKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_3_1()), new TokenAlias(false, false, grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_3_3()));
+		match_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()));
+		match_XBlockExpression_SemicolonKeyword_2_1_q = new TokenAlias(false, true, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
+		match_XExpressionInClosure_SemicolonKeyword_1_1_q = new TokenAlias(false, true, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
+		match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()), new TokenAlias(false, false, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()));
+		match_XImportDeclaration_SemicolonKeyword_2_q = new TokenAlias(false, true, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2());
+		match_XParenthesizedExpression_LeftParenthesisKeyword_0_a = new TokenAlias(true, true, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
+		match_XParenthesizedExpression_LeftParenthesisKeyword_0_p = new TokenAlias(true, false, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
+	}
+	
+	@Override
+	protected String getUnassignedRuleCallToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		if(ruleCall.getRule() == grammarAccess.getArrayBracketsRule())
+			return getArrayBracketsToken(semanticObject, ruleCall, node);
+		else if(ruleCall.getRule() == grammarAccess.getOpSingleAssignRule())
+			return getOpSingleAssignToken(semanticObject, ruleCall, node);
+		return "";
+	}
+	
+	/**
+	 * ArrayBrackets :
+	 * 	'[' ']'
+	 * ;
+	 */
+	protected String getArrayBracketsToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		if (node != null)
+			return getTokenText(node);
+		return "[]";
+	}
+	
+	/**
+	 * OpSingleAssign:
+	 * 	'='
+	 * ;
+	 */
+	protected String getOpSingleAssignToken(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_StatemachinePackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_3__q.equals(syntax))
+				emit_StatemachinePackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_StatemachineState___RightCurlyBracketKeyword_3_0_3_TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1__a.equals(syntax))
+				emit_StatemachineState___RightCurlyBracketKeyword_3_0_3_TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_StatemachineState___TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1_RightCurlyBracketKeyword_3_0_3__a.equals(syntax))
+				emit_StatemachineState___TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1_RightCurlyBracketKeyword_3_0_3__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_StatemachineTrigger___GuardsKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__q.equals(syntax))
+				emit_StatemachineTrigger___GuardsKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q.equals(syntax))
+				emit_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_XBlockExpression_SemicolonKeyword_2_1_q.equals(syntax))
+				emit_XBlockExpression_SemicolonKeyword_2_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_XExpressionInClosure_SemicolonKeyword_1_1_q.equals(syntax))
+				emit_XExpressionInClosure_SemicolonKeyword_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q.equals(syntax))
+				emit_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_XImportDeclaration_SemicolonKeyword_2_q.equals(syntax))
+				emit_XImportDeclaration_SemicolonKeyword_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_XParenthesizedExpression_LeftParenthesisKeyword_0_a.equals(syntax))
+				emit_XParenthesizedExpression_LeftParenthesisKeyword_0_a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_XParenthesizedExpression_LeftParenthesisKeyword_0_p.equals(syntax))
+				emit_XParenthesizedExpression_LeftParenthesisKeyword_0_p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else acceptNodes(getLastNavigableState(), syntaxNodes);
+		}
+	}
+
+	/**
+	 * Syntax:
+	 *     ('{' '}')?
+	 */
+	protected void emit_StatemachinePackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Syntax:
+	 *     ('}' 'triggers' '{')*
+	 */
+	protected void emit_StatemachineState___RightCurlyBracketKeyword_3_0_3_TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Syntax:
+	 *     ('triggers' '{' '}')*
+	 */
+	protected void emit_StatemachineState___TriggersKeyword_3_0_0_LeftCurlyBracketKeyword_3_0_1_RightCurlyBracketKeyword_3_0_3__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Syntax:
+	 *     ('guards' '{' '}')?
+	 */
+	protected void emit_StatemachineTrigger___GuardsKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Syntax:
+	 *     ('(' ')')?
+	 */
+	protected void emit_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Syntax:
+	 *     ';'?
+	 */
+	protected void emit_XBlockExpression_SemicolonKeyword_2_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Syntax:
+	 *     ';'?
+	 */
+	protected void emit_XExpressionInClosure_SemicolonKeyword_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * 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);
+	}
+	
+	/**
+	 * Syntax:
+	 *     '('*
+	 */
+	protected void emit_XParenthesizedExpression_LeftParenthesisKeyword_0_a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Syntax:
+	 *     '('+
+	 */
+	protected void emit_XParenthesizedExpression_LeftParenthesisKeyword_0_p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/services/StatemachineDSLGrammarAccess.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/services/StatemachineDSLGrammarAccess.java
new file mode 100644
index 0000000..1f738bc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/services/StatemachineDSLGrammarAccess.java
@@ -0,0 +1,7574 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.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.annotations.services.XbaseWithAnnotationsGrammarAccess;
+import org.eclipse.xtext.xbase.services.XbaseGrammarAccess;
+import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;
+
+@Singleton
+public class StatemachineDSLGrammarAccess extends AbstractGrammarElementFinder {
+	
+	
+	public class StatemachineModelElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineModel");
+		private final Assignment cPackagesAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cPackagesStatemachinePackageParserRuleCall_0 = (RuleCall)cPackagesAssignment.eContents().get(0);
+		
+		//StatemachineModel:
+		//	packages+=StatemachinePackage*;
+		public ParserRule getRule() { return rule; }
+
+		//packages+=StatemachinePackage*
+		public Assignment getPackagesAssignment() { return cPackagesAssignment; }
+
+		//StatemachinePackage
+		public RuleCall getPackagesStatemachinePackageParserRuleCall_0() { return cPackagesStatemachinePackageParserRuleCall_0; }
+	}
+
+	public class StatemachinePackageElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachinePackage");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachinePackageAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPackageKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameQualifiedNameParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Keyword cLeftCurlyBracketKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Assignment cImportsAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final RuleCall cImportsStatemachineImportParserRuleCall_3_1_0 = (RuleCall)cImportsAssignment_3_1.eContents().get(0);
+		private final Assignment cStatemachinesAssignment_3_2 = (Assignment)cGroup_3.eContents().get(2);
+		private final RuleCall cStatemachinesStatemachineParserRuleCall_3_2_0 = (RuleCall)cStatemachinesAssignment_3_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3_3 = (Keyword)cGroup_3.eContents().get(3);
+		
+		//StatemachinePackage:
+		//	{StatemachinePackage} "package" name=QualifiedName ("{" imports+=StatemachineImport* statemachines+=Statemachine*
+		//	"}")?;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachinePackage} "package" name=QualifiedName ("{" imports+=StatemachineImport* statemachines+=Statemachine* "}")?
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachinePackage}
+		public Action getStatemachinePackageAction_0() { return cStatemachinePackageAction_0; }
+
+		//"package"
+		public Keyword getPackageKeyword_1() { return cPackageKeyword_1; }
+
+		//name=QualifiedName
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+
+		//QualifiedName
+		public RuleCall getNameQualifiedNameParserRuleCall_2_0() { return cNameQualifiedNameParserRuleCall_2_0; }
+
+		//("{" imports+=StatemachineImport* statemachines+=Statemachine* "}")?
+		public Group getGroup_3() { return cGroup_3; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_3_0() { return cLeftCurlyBracketKeyword_3_0; }
+
+		//imports+=StatemachineImport*
+		public Assignment getImportsAssignment_3_1() { return cImportsAssignment_3_1; }
+
+		//StatemachineImport
+		public RuleCall getImportsStatemachineImportParserRuleCall_3_1_0() { return cImportsStatemachineImportParserRuleCall_3_1_0; }
+
+		//statemachines+=Statemachine*
+		public Assignment getStatemachinesAssignment_3_2() { return cStatemachinesAssignment_3_2; }
+
+		//Statemachine
+		public RuleCall getStatemachinesStatemachineParserRuleCall_3_2_0() { return cStatemachinesStatemachineParserRuleCall_3_2_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_3_3() { return cRightCurlyBracketKeyword_3_3; }
+	}
+
+	public class StatemachineElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "Statemachine");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cStatemachineKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Assignment cDescriptionAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final Keyword cDescriptionDescribedByKeyword_2_0_0 = (Keyword)cDescriptionAssignment_2_0.eContents().get(0);
+		private final Assignment cDescriptionValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cDescriptionValueTRANSLATABLESTRINGParserRuleCall_2_1_0 = (RuleCall)cDescriptionValueAssignment_2_1.eContents().get(0);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Keyword cFunctiongroupKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Assignment cFunctionGroupAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final CrossReference cFunctionGroupFunctionLibraryStatemachineGroupCrossReference_3_1_0 = (CrossReference)cFunctionGroupAssignment_3_1.eContents().get(0);
+		private final RuleCall cFunctionGroupFunctionLibraryStatemachineGroupIDTerminalRuleCall_3_1_0_1 = (RuleCall)cFunctionGroupFunctionLibraryStatemachineGroupCrossReference_3_1_0.eContents().get(1);
+		private final Keyword cInitialStateKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cInitialStateAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final CrossReference cInitialStateStatemachineStateCrossReference_5_0 = (CrossReference)cInitialStateAssignment_5.eContents().get(0);
+		private final RuleCall cInitialStateStatemachineStateIDTerminalRuleCall_5_0_1 = (RuleCall)cInitialStateStatemachineStateCrossReference_5_0.eContents().get(1);
+		private final Keyword cInitialEventKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cInitialEventAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final CrossReference cInitialEventStatemachineEventCrossReference_7_0 = (CrossReference)cInitialEventAssignment_7.eContents().get(0);
+		private final RuleCall cInitialEventStatemachineEventIDTerminalRuleCall_7_0_1 = (RuleCall)cInitialEventStatemachineEventCrossReference_7_0.eContents().get(1);
+		private final Group cGroup_8 = (Group)cGroup.eContents().get(8);
+		private final Keyword cEventsKeyword_8_0 = (Keyword)cGroup_8.eContents().get(0);
+		private final Group cGroup_8_1 = (Group)cGroup_8.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_1_0 = (Keyword)cGroup_8_1.eContents().get(0);
+		private final Assignment cEventsAssignment_8_1_1 = (Assignment)cGroup_8_1.eContents().get(1);
+		private final RuleCall cEventsStatemachineEventParserRuleCall_8_1_1_0 = (RuleCall)cEventsAssignment_8_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_1_2 = (Keyword)cGroup_8_1.eContents().get(2);
+		private final Group cGroup_9 = (Group)cGroup.eContents().get(9);
+		private final Keyword cControlsKeyword_9_0 = (Keyword)cGroup_9.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_9_1 = (Keyword)cGroup_9.eContents().get(1);
+		private final Assignment cControlsAssignment_9_2 = (Assignment)cGroup_9.eContents().get(2);
+		private final RuleCall cControlsStatemachineControlParserRuleCall_9_2_0 = (RuleCall)cControlsAssignment_9_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_9_3 = (Keyword)cGroup_9.eContents().get(3);
+		private final Group cGroup_10 = (Group)cGroup.eContents().get(10);
+		private final Keyword cStatesKeyword_10_0 = (Keyword)cGroup_10.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_10_1 = (Keyword)cGroup_10.eContents().get(1);
+		private final Assignment cStatesAssignment_10_2 = (Assignment)cGroup_10.eContents().get(2);
+		private final RuleCall cStatesStatemachineStateParserRuleCall_10_2_0 = (RuleCall)cStatesAssignment_10_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_10_3 = (Keyword)cGroup_10.eContents().get(3);
+		
+		//Statemachine:
+		//	"statemachine" name=ID (description?="described by" descriptionValue=TRANSLATABLESTRING)? ("functiongroup"
+		//	functionGroup=[function::FunctionLibraryStatemachineGroup])? "initialState" initialState=[StatemachineState]
+		//	"initialEvent" initialEvent=[StatemachineEvent] ("events" ("{" events+=StatemachineEvent* "}")) ("controls" "{"
+		//	controls+=StatemachineControl* "}") ("states" "{" states+=StatemachineState* "}");
+		public ParserRule getRule() { return rule; }
+
+		//"statemachine" name=ID (description?="described by" descriptionValue=TRANSLATABLESTRING)? ("functiongroup"
+		//functionGroup=[function::FunctionLibraryStatemachineGroup])? "initialState" initialState=[StatemachineState]
+		//"initialEvent" initialEvent=[StatemachineEvent] ("events" ("{" events+=StatemachineEvent* "}")) ("controls" "{"
+		//controls+=StatemachineControl* "}") ("states" "{" states+=StatemachineState* "}")
+		public Group getGroup() { return cGroup; }
+
+		//"statemachine"
+		public Keyword getStatemachineKeyword_0() { return cStatemachineKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//(description?="described by" descriptionValue=TRANSLATABLESTRING)?
+		public Group getGroup_2() { return cGroup_2; }
+
+		//description?="described by"
+		public Assignment getDescriptionAssignment_2_0() { return cDescriptionAssignment_2_0; }
+
+		//"described by"
+		public Keyword getDescriptionDescribedByKeyword_2_0_0() { return cDescriptionDescribedByKeyword_2_0_0; }
+
+		//descriptionValue=TRANSLATABLESTRING
+		public Assignment getDescriptionValueAssignment_2_1() { return cDescriptionValueAssignment_2_1; }
+
+		//TRANSLATABLESTRING
+		public RuleCall getDescriptionValueTRANSLATABLESTRINGParserRuleCall_2_1_0() { return cDescriptionValueTRANSLATABLESTRINGParserRuleCall_2_1_0; }
+
+		//("functiongroup" functionGroup=[function::FunctionLibraryStatemachineGroup])?
+		public Group getGroup_3() { return cGroup_3; }
+
+		//"functiongroup"
+		public Keyword getFunctiongroupKeyword_3_0() { return cFunctiongroupKeyword_3_0; }
+
+		//functionGroup=[function::FunctionLibraryStatemachineGroup]
+		public Assignment getFunctionGroupAssignment_3_1() { return cFunctionGroupAssignment_3_1; }
+
+		//[function::FunctionLibraryStatemachineGroup]
+		public CrossReference getFunctionGroupFunctionLibraryStatemachineGroupCrossReference_3_1_0() { return cFunctionGroupFunctionLibraryStatemachineGroupCrossReference_3_1_0; }
+
+		//ID
+		public RuleCall getFunctionGroupFunctionLibraryStatemachineGroupIDTerminalRuleCall_3_1_0_1() { return cFunctionGroupFunctionLibraryStatemachineGroupIDTerminalRuleCall_3_1_0_1; }
+
+		//"initialState"
+		public Keyword getInitialStateKeyword_4() { return cInitialStateKeyword_4; }
+
+		//initialState=[StatemachineState]
+		public Assignment getInitialStateAssignment_5() { return cInitialStateAssignment_5; }
+
+		//[StatemachineState]
+		public CrossReference getInitialStateStatemachineStateCrossReference_5_0() { return cInitialStateStatemachineStateCrossReference_5_0; }
+
+		//ID
+		public RuleCall getInitialStateStatemachineStateIDTerminalRuleCall_5_0_1() { return cInitialStateStatemachineStateIDTerminalRuleCall_5_0_1; }
+
+		//"initialEvent"
+		public Keyword getInitialEventKeyword_6() { return cInitialEventKeyword_6; }
+
+		//initialEvent=[StatemachineEvent]
+		public Assignment getInitialEventAssignment_7() { return cInitialEventAssignment_7; }
+
+		//[StatemachineEvent]
+		public CrossReference getInitialEventStatemachineEventCrossReference_7_0() { return cInitialEventStatemachineEventCrossReference_7_0; }
+
+		//ID
+		public RuleCall getInitialEventStatemachineEventIDTerminalRuleCall_7_0_1() { return cInitialEventStatemachineEventIDTerminalRuleCall_7_0_1; }
+
+		//"events" ("{" events+=StatemachineEvent* "}")
+		public Group getGroup_8() { return cGroup_8; }
+
+		//"events"
+		public Keyword getEventsKeyword_8_0() { return cEventsKeyword_8_0; }
+
+		//"{" events+=StatemachineEvent* "}"
+		public Group getGroup_8_1() { return cGroup_8_1; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_8_1_0() { return cLeftCurlyBracketKeyword_8_1_0; }
+
+		//events+=StatemachineEvent*
+		public Assignment getEventsAssignment_8_1_1() { return cEventsAssignment_8_1_1; }
+
+		//StatemachineEvent
+		public RuleCall getEventsStatemachineEventParserRuleCall_8_1_1_0() { return cEventsStatemachineEventParserRuleCall_8_1_1_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_8_1_2() { return cRightCurlyBracketKeyword_8_1_2; }
+
+		//"controls" "{" controls+=StatemachineControl* "}"
+		public Group getGroup_9() { return cGroup_9; }
+
+		//"controls"
+		public Keyword getControlsKeyword_9_0() { return cControlsKeyword_9_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_9_1() { return cLeftCurlyBracketKeyword_9_1; }
+
+		//controls+=StatemachineControl*
+		public Assignment getControlsAssignment_9_2() { return cControlsAssignment_9_2; }
+
+		//StatemachineControl
+		public RuleCall getControlsStatemachineControlParserRuleCall_9_2_0() { return cControlsStatemachineControlParserRuleCall_9_2_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_9_3() { return cRightCurlyBracketKeyword_9_3; }
+
+		//"states" "{" states+=StatemachineState* "}"
+		public Group getGroup_10() { return cGroup_10; }
+
+		//"states"
+		public Keyword getStatesKeyword_10_0() { return cStatesKeyword_10_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_10_1() { return cLeftCurlyBracketKeyword_10_1; }
+
+		//states+=StatemachineState*
+		public Assignment getStatesAssignment_10_2() { return cStatesAssignment_10_2; }
+
+		//StatemachineState
+		public RuleCall getStatesStatemachineStateParserRuleCall_10_2_0() { return cStatesStatemachineStateParserRuleCall_10_2_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_10_3() { return cRightCurlyBracketKeyword_10_3; }
+	}
+
+	public class StatemachineEventElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineEvent");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cEventKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		
+		//StatemachineEvent:
+		//	"event" name=ID;
+		public ParserRule getRule() { return rule; }
+
+		//"event" name=ID
+		public Group getGroup() { return cGroup; }
+
+		//"event"
+		public Keyword getEventKeyword_0() { return cEventKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+	}
+
+	public class StatemachineStateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineState");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cStateKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
+		private final Keyword cTriggersKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3_0_1 = (Keyword)cGroup_3_0.eContents().get(1);
+		private final Assignment cTriggersAssignment_3_0_2 = (Assignment)cGroup_3_0.eContents().get(2);
+		private final RuleCall cTriggersStatemachineTriggerParserRuleCall_3_0_2_0 = (RuleCall)cTriggersAssignment_3_0_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3_0_3 = (Keyword)cGroup_3_0.eContents().get(3);
+		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
+		private final Keyword cIdentityKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Assignment cIdentityAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
+		private final RuleCall cIdentityStatemachineOperationParserRuleCall_3_1_1_0 = (RuleCall)cIdentityAssignment_3_1_1.eContents().get(0);
+		private final Group cGroup_3_2 = (Group)cUnorderedGroup_3.eContents().get(2);
+		private final Keyword cKeystrokeKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_3_2_1 = (Keyword)cGroup_3_2.eContents().get(1);
+		private final Assignment cKeystrokeAssignment_3_2_2 = (Assignment)cGroup_3_2.eContents().get(2);
+		private final CrossReference cKeystrokeStatemachineControlFieldAttributeCrossReference_3_2_2_0 = (CrossReference)cKeystrokeAssignment_3_2_2.eContents().get(0);
+		private final RuleCall cKeystrokeStatemachineControlFieldAttributeIDTerminalRuleCall_3_2_2_0_1 = (RuleCall)cKeystrokeStatemachineControlFieldAttributeCrossReference_3_2_2_0.eContents().get(1);
+		private final Group cGroup_3_2_3 = (Group)cGroup_3_2.eContents().get(3);
+		private final Assignment cHasKeyOperationAssignment_3_2_3_0 = (Assignment)cGroup_3_2_3.eContents().get(0);
+		private final Keyword cHasKeyOperationAndKeyword_3_2_3_0_0 = (Keyword)cHasKeyOperationAssignment_3_2_3_0.eContents().get(0);
+		private final Assignment cKeyOperationAssignment_3_2_3_1 = (Assignment)cGroup_3_2_3.eContents().get(1);
+		private final RuleCall cKeyOperationStatemachineOperationParserRuleCall_3_2_3_1_0 = (RuleCall)cKeyOperationAssignment_3_2_3_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//StatemachineState:
+		//	"state" name=ID "{" (("triggers" "{" triggers+=StatemachineTrigger* "}")? & ("identity"
+		//	identity=StatemachineOperation)? & ("keystroke" "@" keystroke=[StatemachineControlFieldAttribute]
+		//	(hasKeyOperation?="and" keyOperation=StatemachineOperation)?)?) "}";
+		public ParserRule getRule() { return rule; }
+
+		//"state" name=ID "{" (("triggers" "{" triggers+=StatemachineTrigger* "}")? & ("identity" identity=StatemachineOperation)?
+		//& ("keystroke" "@" keystroke=[StatemachineControlFieldAttribute] (hasKeyOperation?="and"
+		//keyOperation=StatemachineOperation)?)?) "}"
+		public Group getGroup() { return cGroup; }
+
+		//"state"
+		public Keyword getStateKeyword_0() { return cStateKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+
+		//("triggers" "{" triggers+=StatemachineTrigger* "}")? & ("identity" identity=StatemachineOperation)? & ("keystroke" "@"
+		//keystroke=[StatemachineControlFieldAttribute] (hasKeyOperation?="and" keyOperation=StatemachineOperation)?)?
+		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
+
+		//("triggers" "{" triggers+=StatemachineTrigger* "}")?
+		public Group getGroup_3_0() { return cGroup_3_0; }
+
+		//"triggers"
+		public Keyword getTriggersKeyword_3_0_0() { return cTriggersKeyword_3_0_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_3_0_1() { return cLeftCurlyBracketKeyword_3_0_1; }
+
+		//triggers+=StatemachineTrigger*
+		public Assignment getTriggersAssignment_3_0_2() { return cTriggersAssignment_3_0_2; }
+
+		//StatemachineTrigger
+		public RuleCall getTriggersStatemachineTriggerParserRuleCall_3_0_2_0() { return cTriggersStatemachineTriggerParserRuleCall_3_0_2_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_3_0_3() { return cRightCurlyBracketKeyword_3_0_3; }
+
+		//("identity" identity=StatemachineOperation)?
+		public Group getGroup_3_1() { return cGroup_3_1; }
+
+		//"identity"
+		public Keyword getIdentityKeyword_3_1_0() { return cIdentityKeyword_3_1_0; }
+
+		//identity=StatemachineOperation
+		public Assignment getIdentityAssignment_3_1_1() { return cIdentityAssignment_3_1_1; }
+
+		//StatemachineOperation
+		public RuleCall getIdentityStatemachineOperationParserRuleCall_3_1_1_0() { return cIdentityStatemachineOperationParserRuleCall_3_1_1_0; }
+
+		//("keystroke" "@" keystroke=[StatemachineControlFieldAttribute] (hasKeyOperation?="and"
+		//keyOperation=StatemachineOperation)?)?
+		public Group getGroup_3_2() { return cGroup_3_2; }
+
+		//"keystroke"
+		public Keyword getKeystrokeKeyword_3_2_0() { return cKeystrokeKeyword_3_2_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_3_2_1() { return cCommercialAtKeyword_3_2_1; }
+
+		//keystroke=[StatemachineControlFieldAttribute]
+		public Assignment getKeystrokeAssignment_3_2_2() { return cKeystrokeAssignment_3_2_2; }
+
+		//[StatemachineControlFieldAttribute]
+		public CrossReference getKeystrokeStatemachineControlFieldAttributeCrossReference_3_2_2_0() { return cKeystrokeStatemachineControlFieldAttributeCrossReference_3_2_2_0; }
+
+		//ID
+		public RuleCall getKeystrokeStatemachineControlFieldAttributeIDTerminalRuleCall_3_2_2_0_1() { return cKeystrokeStatemachineControlFieldAttributeIDTerminalRuleCall_3_2_2_0_1; }
+
+		//(hasKeyOperation?="and" keyOperation=StatemachineOperation)?
+		public Group getGroup_3_2_3() { return cGroup_3_2_3; }
+
+		//hasKeyOperation?="and"
+		public Assignment getHasKeyOperationAssignment_3_2_3_0() { return cHasKeyOperationAssignment_3_2_3_0; }
+
+		//"and"
+		public Keyword getHasKeyOperationAndKeyword_3_2_3_0_0() { return cHasKeyOperationAndKeyword_3_2_3_0_0; }
+
+		//keyOperation=StatemachineOperation
+		public Assignment getKeyOperationAssignment_3_2_3_1() { return cKeyOperationAssignment_3_2_3_1; }
+
+		//StatemachineOperation
+		public RuleCall getKeyOperationStatemachineOperationParserRuleCall_3_2_3_1_0() { return cKeyOperationStatemachineOperationParserRuleCall_3_2_3_1_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+
+	public class StatemachineTriggerElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineTrigger");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineTriggerAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cTriggerKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cTriggersAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cTriggersStatemachineEventCrossReference_2_0 = (CrossReference)cTriggersAssignment_2.eContents().get(0);
+		private final RuleCall cTriggersStatemachineEventIDTerminalRuleCall_2_0_1 = (RuleCall)cTriggersStatemachineEventCrossReference_2_0.eContents().get(1);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Keyword cGuardsKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
+		private final Assignment cGuardsAssignment_3_2 = (Assignment)cGroup_3.eContents().get(2);
+		private final RuleCall cGuardsStatemachineGuardParserRuleCall_3_2_0 = (RuleCall)cGuardsAssignment_3_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3_3 = (Keyword)cGroup_3.eContents().get(3);
+		private final Keyword cActionsKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Assignment cHasTransitionAssignment_5_0 = (Assignment)cGroup_5.eContents().get(0);
+		private final Keyword cHasTransitionTransitionKeyword_5_0_0 = (Keyword)cHasTransitionAssignment_5_0.eContents().get(0);
+		private final Assignment cTransitionAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
+		private final CrossReference cTransitionStatemachineStateCrossReference_5_1_0 = (CrossReference)cTransitionAssignment_5_1.eContents().get(0);
+		private final RuleCall cTransitionStatemachineStateIDTerminalRuleCall_5_1_0_1 = (RuleCall)cTransitionStatemachineStateCrossReference_5_1_0.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cActionsAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cActionsStatemachineActionParserRuleCall_7_0 = (RuleCall)cActionsAssignment_7.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		
+		//StatemachineTrigger:
+		//	{StatemachineTrigger} "trigger" triggers+=[StatemachineEvent]* ("guards" "{" guards+=StatemachineGuard* "}")?
+		//	"actions" (hasTransition?="transition" transition=[StatemachineState])? "{" actions+=StatemachineAction* "}";
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineTrigger} "trigger" triggers+=[StatemachineEvent]* ("guards" "{" guards+=StatemachineGuard* "}")? "actions"
+		//(hasTransition?="transition" transition=[StatemachineState])? "{" actions+=StatemachineAction* "}"
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineTrigger}
+		public Action getStatemachineTriggerAction_0() { return cStatemachineTriggerAction_0; }
+
+		//"trigger"
+		public Keyword getTriggerKeyword_1() { return cTriggerKeyword_1; }
+
+		//triggers+=[StatemachineEvent]*
+		public Assignment getTriggersAssignment_2() { return cTriggersAssignment_2; }
+
+		//[StatemachineEvent]
+		public CrossReference getTriggersStatemachineEventCrossReference_2_0() { return cTriggersStatemachineEventCrossReference_2_0; }
+
+		//ID
+		public RuleCall getTriggersStatemachineEventIDTerminalRuleCall_2_0_1() { return cTriggersStatemachineEventIDTerminalRuleCall_2_0_1; }
+
+		//("guards" "{" guards+=StatemachineGuard* "}")?
+		public Group getGroup_3() { return cGroup_3; }
+
+		//"guards"
+		public Keyword getGuardsKeyword_3_0() { return cGuardsKeyword_3_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_3_1() { return cLeftCurlyBracketKeyword_3_1; }
+
+		//guards+=StatemachineGuard*
+		public Assignment getGuardsAssignment_3_2() { return cGuardsAssignment_3_2; }
+
+		//StatemachineGuard
+		public RuleCall getGuardsStatemachineGuardParserRuleCall_3_2_0() { return cGuardsStatemachineGuardParserRuleCall_3_2_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_3_3() { return cRightCurlyBracketKeyword_3_3; }
+
+		//"actions"
+		public Keyword getActionsKeyword_4() { return cActionsKeyword_4; }
+
+		//(hasTransition?="transition" transition=[StatemachineState])?
+		public Group getGroup_5() { return cGroup_5; }
+
+		//hasTransition?="transition"
+		public Assignment getHasTransitionAssignment_5_0() { return cHasTransitionAssignment_5_0; }
+
+		//"transition"
+		public Keyword getHasTransitionTransitionKeyword_5_0_0() { return cHasTransitionTransitionKeyword_5_0_0; }
+
+		//transition=[StatemachineState]
+		public Assignment getTransitionAssignment_5_1() { return cTransitionAssignment_5_1; }
+
+		//[StatemachineState]
+		public CrossReference getTransitionStatemachineStateCrossReference_5_1_0() { return cTransitionStatemachineStateCrossReference_5_1_0; }
+
+		//ID
+		public RuleCall getTransitionStatemachineStateIDTerminalRuleCall_5_1_0_1() { return cTransitionStatemachineStateIDTerminalRuleCall_5_1_0_1; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
+
+		//actions+=StatemachineAction*
+		public Assignment getActionsAssignment_7() { return cActionsAssignment_7; }
+
+		//StatemachineAction
+		public RuleCall getActionsStatemachineActionParserRuleCall_7_0() { return cActionsStatemachineActionParserRuleCall_7_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
+	}
+
+	public class StatemachineActionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineAction");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cStatemachineActionPeripheralBlinkRateParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStatemachineActionPeripheralClearParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cStatemachineActionPeripheralCreateWindowParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cStatemachineActionPeripheralCursorTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cStatemachineActionPeripheralDestroyWindowParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cStatemachineActionPeripheralDisplayBitmapParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cStatemachineActionPeripheralDisplayTextParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cStatemachineActionPeripheralDisplayTextAtParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
+		private final RuleCall cStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
+		private final RuleCall cStatemachineActionPeripheralMarqueeFormatParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
+		private final RuleCall cStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
+		private final RuleCall cStatemachineActionPeripheralMarqueeTypeParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
+		private final RuleCall cStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13 = (RuleCall)cAlternatives.eContents().get(13);
+		private final RuleCall cStatemachineActionPeripheralScrollParserRuleCall_14 = (RuleCall)cAlternatives.eContents().get(14);
+		private final RuleCall cStatemachineActionPeripheralOpenDrawerParserRuleCall_15 = (RuleCall)cAlternatives.eContents().get(15);
+		private final RuleCall cStatemachineActionPeripheralPrintBarcodeParserRuleCall_16 = (RuleCall)cAlternatives.eContents().get(16);
+		private final RuleCall cStatemachineActionPeripheralPrintBitmapParserRuleCall_17 = (RuleCall)cAlternatives.eContents().get(17);
+		private final RuleCall cStatemachineActionPeripheralPrintCutParserRuleCall_18 = (RuleCall)cAlternatives.eContents().get(18);
+		private final RuleCall cStatemachineActionPeripheralPrintNormalParserRuleCall_19 = (RuleCall)cAlternatives.eContents().get(19);
+		private final RuleCall cStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20 = (RuleCall)cAlternatives.eContents().get(20);
+		private final RuleCall cStatemachineActionPeripheralPTOpenParserRuleCall_21 = (RuleCall)cAlternatives.eContents().get(21);
+		private final RuleCall cStatemachineActionPeripheralPTCloseParserRuleCall_22 = (RuleCall)cAlternatives.eContents().get(22);
+		private final RuleCall cStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23 = (RuleCall)cAlternatives.eContents().get(23);
+		private final RuleCall cStatemachineActionPeripheralPTReversalParserRuleCall_24 = (RuleCall)cAlternatives.eContents().get(24);
+		private final RuleCall cStatemachineActionPeripheralPTRegistrationParserRuleCall_25 = (RuleCall)cAlternatives.eContents().get(25);
+		private final RuleCall cStatemachineActionPeripheralPTAuthorizationParserRuleCall_26 = (RuleCall)cAlternatives.eContents().get(26);
+		private final RuleCall cStatemachineActionPeripheralPrintReportParserRuleCall_27 = (RuleCall)cAlternatives.eContents().get(27);
+		private final RuleCall cStatemachineActionFieldSetParserRuleCall_28 = (RuleCall)cAlternatives.eContents().get(28);
+		private final RuleCall cStatemachineActionFieldRemoveParserRuleCall_29 = (RuleCall)cAlternatives.eContents().get(29);
+		private final RuleCall cStatemachineActionItemVisibleParserRuleCall_30 = (RuleCall)cAlternatives.eContents().get(30);
+		private final RuleCall cStatemachineActionItemInvisibleParserRuleCall_31 = (RuleCall)cAlternatives.eContents().get(31);
+		private final RuleCall cStatemachineActionFieldClearParserRuleCall_32 = (RuleCall)cAlternatives.eContents().get(32);
+		private final RuleCall cStatemachineActionButtonCaptionParserRuleCall_33 = (RuleCall)cAlternatives.eContents().get(33);
+		private final RuleCall cStatemachineActionButtonImageParserRuleCall_34 = (RuleCall)cAlternatives.eContents().get(34);
+		private final RuleCall cStatemachineActionDTOFindParserRuleCall_35 = (RuleCall)cAlternatives.eContents().get(35);
+		private final RuleCall cStatemachineStorageParserRuleCall_36 = (RuleCall)cAlternatives.eContents().get(36);
+		private final RuleCall cStatemachineActionSchedulerParserRuleCall_37 = (RuleCall)cAlternatives.eContents().get(37);
+		private final RuleCall cStatemachineOperationParserRuleCall_38 = (RuleCall)cAlternatives.eContents().get(38);
+		private final RuleCall cStatemachineActionConditionalTransitionParserRuleCall_39 = (RuleCall)cAlternatives.eContents().get(39);
+		
+		//StatemachineAction:
+		//	StatemachineActionPeripheralBlinkRate | StatemachineActionPeripheralClear | StatemachineActionPeripheralCreateWindow
+		//	| StatemachineActionPeripheralCursorType | StatemachineActionPeripheralDestroyWindow |
+		//	StatemachineActionPeripheralDeviceBrightness | StatemachineActionPeripheralDisplayBitmap |
+		//	StatemachineActionPeripheralDisplayText | StatemachineActionPeripheralDisplayTextAt |
+		//	StatemachineActionPeripheralInterCharacterWait | StatemachineActionPeripheralMarqueeFormat |
+		//	StatemachineActionPeripheralMarqueeRepeatWait | StatemachineActionPeripheralMarqueeType |
+		//	StatemachineActionPeripheralMarqueeUnitWait | StatemachineActionPeripheralScroll |
+		//	StatemachineActionPeripheralOpenDrawer | StatemachineActionPeripheralPrintBarcode |
+		//	StatemachineActionPeripheralPrintBitmap | StatemachineActionPeripheralPrintCut |
+		//	StatemachineActionPeripheralPrintNormal | StatemachineActionPeripheralPrintRegisterBitmap |
+		//	StatemachineActionPeripheralPTOpen | StatemachineActionPeripheralPTClose | StatemachineActionPeripheralPTAcknowledge
+		//	| //	StatemachineActionPeripheralPTPrepaidTopUp|
+		//	StatemachineActionPeripheralPTReversal | StatemachineActionPeripheralPTRegistration |
+		//	StatemachineActionPeripheralPTAuthorization | StatemachineActionPeripheralPrintReport | StatemachineActionFieldSet |
+		//	StatemachineActionFieldRemove | StatemachineActionItemVisible | StatemachineActionItemInvisible |
+		//	StatemachineActionFieldClear | StatemachineActionButtonCaption | StatemachineActionButtonImage |
+		//	StatemachineActionDTOFind | StatemachineStorage | StatemachineActionScheduler | StatemachineOperation |
+		//	StatemachineActionConditionalTransition;
+		public ParserRule getRule() { return rule; }
+
+		//StatemachineActionPeripheralBlinkRate | StatemachineActionPeripheralClear | StatemachineActionPeripheralCreateWindow |
+		//StatemachineActionPeripheralCursorType | StatemachineActionPeripheralDestroyWindow |
+		//StatemachineActionPeripheralDeviceBrightness | StatemachineActionPeripheralDisplayBitmap |
+		//StatemachineActionPeripheralDisplayText | StatemachineActionPeripheralDisplayTextAt |
+		//StatemachineActionPeripheralInterCharacterWait | StatemachineActionPeripheralMarqueeFormat |
+		//StatemachineActionPeripheralMarqueeRepeatWait | StatemachineActionPeripheralMarqueeType |
+		//StatemachineActionPeripheralMarqueeUnitWait | StatemachineActionPeripheralScroll |
+		//StatemachineActionPeripheralOpenDrawer | StatemachineActionPeripheralPrintBarcode |
+		//StatemachineActionPeripheralPrintBitmap | StatemachineActionPeripheralPrintCut |
+		//StatemachineActionPeripheralPrintNormal | StatemachineActionPeripheralPrintRegisterBitmap |
+		//StatemachineActionPeripheralPTOpen | StatemachineActionPeripheralPTClose | StatemachineActionPeripheralPTAcknowledge | //	StatemachineActionPeripheralPTPrepaidTopUp|
+		//StatemachineActionPeripheralPTReversal | StatemachineActionPeripheralPTRegistration |
+		//StatemachineActionPeripheralPTAuthorization | StatemachineActionPeripheralPrintReport | StatemachineActionFieldSet |
+		//StatemachineActionFieldRemove | StatemachineActionItemVisible | StatemachineActionItemInvisible |
+		//StatemachineActionFieldClear | StatemachineActionButtonCaption | StatemachineActionButtonImage |
+		//StatemachineActionDTOFind | StatemachineStorage | StatemachineActionScheduler | StatemachineOperation |
+		//StatemachineActionConditionalTransition
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//StatemachineActionPeripheralBlinkRate
+		public RuleCall getStatemachineActionPeripheralBlinkRateParserRuleCall_0() { return cStatemachineActionPeripheralBlinkRateParserRuleCall_0; }
+
+		//StatemachineActionPeripheralClear
+		public RuleCall getStatemachineActionPeripheralClearParserRuleCall_1() { return cStatemachineActionPeripheralClearParserRuleCall_1; }
+
+		//StatemachineActionPeripheralCreateWindow
+		public RuleCall getStatemachineActionPeripheralCreateWindowParserRuleCall_2() { return cStatemachineActionPeripheralCreateWindowParserRuleCall_2; }
+
+		//StatemachineActionPeripheralCursorType
+		public RuleCall getStatemachineActionPeripheralCursorTypeParserRuleCall_3() { return cStatemachineActionPeripheralCursorTypeParserRuleCall_3; }
+
+		//StatemachineActionPeripheralDestroyWindow
+		public RuleCall getStatemachineActionPeripheralDestroyWindowParserRuleCall_4() { return cStatemachineActionPeripheralDestroyWindowParserRuleCall_4; }
+
+		//StatemachineActionPeripheralDeviceBrightness
+		public RuleCall getStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5() { return cStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5; }
+
+		//StatemachineActionPeripheralDisplayBitmap
+		public RuleCall getStatemachineActionPeripheralDisplayBitmapParserRuleCall_6() { return cStatemachineActionPeripheralDisplayBitmapParserRuleCall_6; }
+
+		//StatemachineActionPeripheralDisplayText
+		public RuleCall getStatemachineActionPeripheralDisplayTextParserRuleCall_7() { return cStatemachineActionPeripheralDisplayTextParserRuleCall_7; }
+
+		//StatemachineActionPeripheralDisplayTextAt
+		public RuleCall getStatemachineActionPeripheralDisplayTextAtParserRuleCall_8() { return cStatemachineActionPeripheralDisplayTextAtParserRuleCall_8; }
+
+		//StatemachineActionPeripheralInterCharacterWait
+		public RuleCall getStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9() { return cStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9; }
+
+		//StatemachineActionPeripheralMarqueeFormat
+		public RuleCall getStatemachineActionPeripheralMarqueeFormatParserRuleCall_10() { return cStatemachineActionPeripheralMarqueeFormatParserRuleCall_10; }
+
+		//StatemachineActionPeripheralMarqueeRepeatWait
+		public RuleCall getStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11() { return cStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11; }
+
+		//StatemachineActionPeripheralMarqueeType
+		public RuleCall getStatemachineActionPeripheralMarqueeTypeParserRuleCall_12() { return cStatemachineActionPeripheralMarqueeTypeParserRuleCall_12; }
+
+		//StatemachineActionPeripheralMarqueeUnitWait
+		public RuleCall getStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13() { return cStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13; }
+
+		//StatemachineActionPeripheralScroll
+		public RuleCall getStatemachineActionPeripheralScrollParserRuleCall_14() { return cStatemachineActionPeripheralScrollParserRuleCall_14; }
+
+		//StatemachineActionPeripheralOpenDrawer
+		public RuleCall getStatemachineActionPeripheralOpenDrawerParserRuleCall_15() { return cStatemachineActionPeripheralOpenDrawerParserRuleCall_15; }
+
+		//StatemachineActionPeripheralPrintBarcode
+		public RuleCall getStatemachineActionPeripheralPrintBarcodeParserRuleCall_16() { return cStatemachineActionPeripheralPrintBarcodeParserRuleCall_16; }
+
+		//StatemachineActionPeripheralPrintBitmap
+		public RuleCall getStatemachineActionPeripheralPrintBitmapParserRuleCall_17() { return cStatemachineActionPeripheralPrintBitmapParserRuleCall_17; }
+
+		//StatemachineActionPeripheralPrintCut
+		public RuleCall getStatemachineActionPeripheralPrintCutParserRuleCall_18() { return cStatemachineActionPeripheralPrintCutParserRuleCall_18; }
+
+		//StatemachineActionPeripheralPrintNormal
+		public RuleCall getStatemachineActionPeripheralPrintNormalParserRuleCall_19() { return cStatemachineActionPeripheralPrintNormalParserRuleCall_19; }
+
+		//StatemachineActionPeripheralPrintRegisterBitmap
+		public RuleCall getStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20() { return cStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20; }
+
+		//StatemachineActionPeripheralPTOpen
+		public RuleCall getStatemachineActionPeripheralPTOpenParserRuleCall_21() { return cStatemachineActionPeripheralPTOpenParserRuleCall_21; }
+
+		//StatemachineActionPeripheralPTClose
+		public RuleCall getStatemachineActionPeripheralPTCloseParserRuleCall_22() { return cStatemachineActionPeripheralPTCloseParserRuleCall_22; }
+
+		//StatemachineActionPeripheralPTAcknowledge
+		public RuleCall getStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23() { return cStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23; }
+
+		////	StatemachineActionPeripheralPTPrepaidTopUp|
+		//StatemachineActionPeripheralPTReversal
+		public RuleCall getStatemachineActionPeripheralPTReversalParserRuleCall_24() { return cStatemachineActionPeripheralPTReversalParserRuleCall_24; }
+
+		//StatemachineActionPeripheralPTRegistration
+		public RuleCall getStatemachineActionPeripheralPTRegistrationParserRuleCall_25() { return cStatemachineActionPeripheralPTRegistrationParserRuleCall_25; }
+
+		//StatemachineActionPeripheralPTAuthorization
+		public RuleCall getStatemachineActionPeripheralPTAuthorizationParserRuleCall_26() { return cStatemachineActionPeripheralPTAuthorizationParserRuleCall_26; }
+
+		//StatemachineActionPeripheralPrintReport
+		public RuleCall getStatemachineActionPeripheralPrintReportParserRuleCall_27() { return cStatemachineActionPeripheralPrintReportParserRuleCall_27; }
+
+		//StatemachineActionFieldSet
+		public RuleCall getStatemachineActionFieldSetParserRuleCall_28() { return cStatemachineActionFieldSetParserRuleCall_28; }
+
+		//StatemachineActionFieldRemove
+		public RuleCall getStatemachineActionFieldRemoveParserRuleCall_29() { return cStatemachineActionFieldRemoveParserRuleCall_29; }
+
+		//StatemachineActionItemVisible
+		public RuleCall getStatemachineActionItemVisibleParserRuleCall_30() { return cStatemachineActionItemVisibleParserRuleCall_30; }
+
+		//StatemachineActionItemInvisible
+		public RuleCall getStatemachineActionItemInvisibleParserRuleCall_31() { return cStatemachineActionItemInvisibleParserRuleCall_31; }
+
+		//StatemachineActionFieldClear
+		public RuleCall getStatemachineActionFieldClearParserRuleCall_32() { return cStatemachineActionFieldClearParserRuleCall_32; }
+
+		//StatemachineActionButtonCaption
+		public RuleCall getStatemachineActionButtonCaptionParserRuleCall_33() { return cStatemachineActionButtonCaptionParserRuleCall_33; }
+
+		//StatemachineActionButtonImage
+		public RuleCall getStatemachineActionButtonImageParserRuleCall_34() { return cStatemachineActionButtonImageParserRuleCall_34; }
+
+		//StatemachineActionDTOFind
+		public RuleCall getStatemachineActionDTOFindParserRuleCall_35() { return cStatemachineActionDTOFindParserRuleCall_35; }
+
+		//StatemachineStorage
+		public RuleCall getStatemachineStorageParserRuleCall_36() { return cStatemachineStorageParserRuleCall_36; }
+
+		//StatemachineActionScheduler
+		public RuleCall getStatemachineActionSchedulerParserRuleCall_37() { return cStatemachineActionSchedulerParserRuleCall_37; }
+
+		//StatemachineOperation
+		public RuleCall getStatemachineOperationParserRuleCall_38() { return cStatemachineOperationParserRuleCall_38; }
+
+		//StatemachineActionConditionalTransition
+		public RuleCall getStatemachineActionConditionalTransitionParserRuleCall_39() { return cStatemachineActionConditionalTransitionParserRuleCall_39; }
+	}
+
+	public class StatemachineActionPeripheralBlinkRateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralBlinkRate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cBlinkRateKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cBlinkRateAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cBlinkRateINTTerminalRuleCall_1_0 = (RuleCall)cBlinkRateAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDeviceAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0 = (CrossReference)cDeviceAssignment_3.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0.eContents().get(1);
+		
+		//// peripherals
+		////lineDisplay
+		//StatemachineActionPeripheralBlinkRate:
+		//	"blinkRate" blinkRate=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"blinkRate" blinkRate=INT "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"blinkRate"
+		public Keyword getBlinkRateKeyword_0() { return cBlinkRateKeyword_0; }
+
+		//blinkRate=INT
+		public Assignment getBlinkRateAssignment_1() { return cBlinkRateAssignment_1; }
+
+		//INT
+		public RuleCall getBlinkRateINTTerminalRuleCall_1_0() { return cBlinkRateINTTerminalRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_3() { return cDeviceAssignment_3; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionPeripheralClearElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralClear");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cClearDeviceKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cDeviceAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0 = (CrossReference)cDeviceAssignment_1.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_1_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralClear:
+		//	"clearDevice" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"clearDevice" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"clearDevice"
+		public Keyword getClearDeviceKeyword_0() { return cClearDeviceKeyword_0; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_1() { return cDeviceAssignment_1; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_1_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineActionPeripheralCreateWindowElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralCreateWindow");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cCreateWindowKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cRowKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cViewportRowAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cViewportRowINTTerminalRuleCall_2_0 = (RuleCall)cViewportRowAssignment_2.eContents().get(0);
+		private final Keyword cColumnKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cViewportColumnAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cViewportColumnINTTerminalRuleCall_4_0 = (RuleCall)cViewportColumnAssignment_4.eContents().get(0);
+		private final Keyword cHeightKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cViewportHeightAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cViewportHeightINTTerminalRuleCall_6_0 = (RuleCall)cViewportHeightAssignment_6.eContents().get(0);
+		private final Keyword cWidthKeyword_7 = (Keyword)cGroup.eContents().get(7);
+		private final Assignment cViewportWidthAssignment_8 = (Assignment)cGroup.eContents().get(8);
+		private final RuleCall cViewportWidthINTTerminalRuleCall_8_0 = (RuleCall)cViewportWidthAssignment_8.eContents().get(0);
+		private final Keyword cWindowHeightKeyword_9 = (Keyword)cGroup.eContents().get(9);
+		private final Assignment cWindowHeightAssignment_10 = (Assignment)cGroup.eContents().get(10);
+		private final RuleCall cWindowHeightINTTerminalRuleCall_10_0 = (RuleCall)cWindowHeightAssignment_10.eContents().get(0);
+		private final Keyword cWindowWidthKeyword_11 = (Keyword)cGroup.eContents().get(11);
+		private final Assignment cWindowWidthAssignment_12 = (Assignment)cGroup.eContents().get(12);
+		private final RuleCall cWindowWidthINTTerminalRuleCall_12_0 = (RuleCall)cWindowWidthAssignment_12.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_13 = (Keyword)cGroup.eContents().get(13);
+		private final Assignment cDeviceAssignment_14 = (Assignment)cGroup.eContents().get(14);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_14_0 = (CrossReference)cDeviceAssignment_14.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_14_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_14_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralCreateWindow:
+		//	"createWindow" "row" viewportRow=INT "column" viewportColumn=INT "height" viewportHeight=INT "width"
+		//	viewportWidth=INT "windowHeight" windowHeight=INT "windowWidth" windowWidth=INT "@"
+		//	device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"createWindow" "row" viewportRow=INT "column" viewportColumn=INT "height" viewportHeight=INT "width" viewportWidth=INT
+		//"windowHeight" windowHeight=INT "windowWidth" windowWidth=INT "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"createWindow"
+		public Keyword getCreateWindowKeyword_0() { return cCreateWindowKeyword_0; }
+
+		//"row"
+		public Keyword getRowKeyword_1() { return cRowKeyword_1; }
+
+		//viewportRow=INT
+		public Assignment getViewportRowAssignment_2() { return cViewportRowAssignment_2; }
+
+		//INT
+		public RuleCall getViewportRowINTTerminalRuleCall_2_0() { return cViewportRowINTTerminalRuleCall_2_0; }
+
+		//"column"
+		public Keyword getColumnKeyword_3() { return cColumnKeyword_3; }
+
+		//viewportColumn=INT
+		public Assignment getViewportColumnAssignment_4() { return cViewportColumnAssignment_4; }
+
+		//INT
+		public RuleCall getViewportColumnINTTerminalRuleCall_4_0() { return cViewportColumnINTTerminalRuleCall_4_0; }
+
+		//"height"
+		public Keyword getHeightKeyword_5() { return cHeightKeyword_5; }
+
+		//viewportHeight=INT
+		public Assignment getViewportHeightAssignment_6() { return cViewportHeightAssignment_6; }
+
+		//INT
+		public RuleCall getViewportHeightINTTerminalRuleCall_6_0() { return cViewportHeightINTTerminalRuleCall_6_0; }
+
+		//"width"
+		public Keyword getWidthKeyword_7() { return cWidthKeyword_7; }
+
+		//viewportWidth=INT
+		public Assignment getViewportWidthAssignment_8() { return cViewportWidthAssignment_8; }
+
+		//INT
+		public RuleCall getViewportWidthINTTerminalRuleCall_8_0() { return cViewportWidthINTTerminalRuleCall_8_0; }
+
+		//"windowHeight"
+		public Keyword getWindowHeightKeyword_9() { return cWindowHeightKeyword_9; }
+
+		//windowHeight=INT
+		public Assignment getWindowHeightAssignment_10() { return cWindowHeightAssignment_10; }
+
+		//INT
+		public RuleCall getWindowHeightINTTerminalRuleCall_10_0() { return cWindowHeightINTTerminalRuleCall_10_0; }
+
+		//"windowWidth"
+		public Keyword getWindowWidthKeyword_11() { return cWindowWidthKeyword_11; }
+
+		//windowWidth=INT
+		public Assignment getWindowWidthAssignment_12() { return cWindowWidthAssignment_12; }
+
+		//INT
+		public RuleCall getWindowWidthINTTerminalRuleCall_12_0() { return cWindowWidthINTTerminalRuleCall_12_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_13() { return cCommercialAtKeyword_13; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_14() { return cDeviceAssignment_14; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_14_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_14_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_14_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_14_0_1; }
+	}
+
+	public class StatemachineActionPeripheralCursorTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralCursorType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cCursorTypeKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cCursorTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cCursorTypeStatemachineLineDisplayCursorTypeEnumRuleCall_1_0 = (RuleCall)cCursorTypeAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDeviceAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0 = (CrossReference)cDeviceAssignment_3.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralCursorType:
+		//	"cursorType" cursorType=StatemachineLineDisplayCursorType "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"cursorType" cursorType=StatemachineLineDisplayCursorType "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"cursorType"
+		public Keyword getCursorTypeKeyword_0() { return cCursorTypeKeyword_0; }
+
+		//cursorType=StatemachineLineDisplayCursorType
+		public Assignment getCursorTypeAssignment_1() { return cCursorTypeAssignment_1; }
+
+		//StatemachineLineDisplayCursorType
+		public RuleCall getCursorTypeStatemachineLineDisplayCursorTypeEnumRuleCall_1_0() { return cCursorTypeStatemachineLineDisplayCursorTypeEnumRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_3() { return cDeviceAssignment_3; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionPeripheralDestroyWindowElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralDestroyWindow");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDestroyWindowKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cDeviceAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0 = (CrossReference)cDeviceAssignment_1.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_1_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralDestroyWindow:
+		//	"destroyWindow" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"destroyWindow" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"destroyWindow"
+		public Keyword getDestroyWindowKeyword_0() { return cDestroyWindowKeyword_0; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_1() { return cDeviceAssignment_1; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_1_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_1_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineActionPeripheralDeviceBrightnessElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralDeviceBrightness");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDeviceBrightnessKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cBrightnessAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cBrightnessINTTerminalRuleCall_1_0 = (RuleCall)cBrightnessAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDeviceAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0 = (CrossReference)cDeviceAssignment_3.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralDeviceBrightness:
+		//	"deviceBrightness" brightness=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"deviceBrightness" brightness=INT "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"deviceBrightness"
+		public Keyword getDeviceBrightnessKeyword_0() { return cDeviceBrightnessKeyword_0; }
+
+		//brightness=INT
+		public Assignment getBrightnessAssignment_1() { return cBrightnessAssignment_1; }
+
+		//INT
+		public RuleCall getBrightnessINTTerminalRuleCall_1_0() { return cBrightnessINTTerminalRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_3() { return cDeviceAssignment_3; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionPeripheralDisplayBitmapElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralDisplayBitmap");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDisplayBitmapKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cIdKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cBitmapIdAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBitmapIdINTTerminalRuleCall_2_0 = (RuleCall)cBitmapIdAssignment_2.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDeviceAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0 = (CrossReference)cDeviceAssignment_4.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_4_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralDisplayBitmap:
+		//	"displayBitmap" "id" bitmapId=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"displayBitmap" "id" bitmapId=INT "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"displayBitmap"
+		public Keyword getDisplayBitmapKeyword_0() { return cDisplayBitmapKeyword_0; }
+
+		//"id"
+		public Keyword getIdKeyword_1() { return cIdKeyword_1; }
+
+		//bitmapId=INT
+		public Assignment getBitmapIdAssignment_2() { return cBitmapIdAssignment_2; }
+
+		//INT
+		public RuleCall getBitmapIdINTTerminalRuleCall_2_0() { return cBitmapIdINTTerminalRuleCall_2_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_3() { return cCommercialAtKeyword_3; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_4() { return cDeviceAssignment_4; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_4_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_4_0_1; }
+	}
+
+	public class StatemachineActionPeripheralDisplayTextElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralDisplayText");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDisplayTextKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cTextAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTextStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cTextAssignment_2.eContents().get(0);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Assignment cHasTypeAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
+		private final Keyword cHasTypeTypeKeyword_3_0_0 = (Keyword)cHasTypeAssignment_3_0.eContents().get(0);
+		private final Assignment cTextTypeAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final RuleCall cTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_3_1_0 = (RuleCall)cTextTypeAssignment_3_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cDeviceAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_5_0 = (CrossReference)cDeviceAssignment_5.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_5_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_5_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralDisplayText:
+		//	"displayText" "text" text=StatemachineActionFieldConcatenation (hasType?="type"
+		//	textType=StatemachineLineDisplayTextType)? "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"displayText" "text" text=StatemachineActionFieldConcatenation (hasType?="type"
+		//textType=StatemachineLineDisplayTextType)? "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"displayText"
+		public Keyword getDisplayTextKeyword_0() { return cDisplayTextKeyword_0; }
+
+		//"text"
+		public Keyword getTextKeyword_1() { return cTextKeyword_1; }
+
+		//text=StatemachineActionFieldConcatenation
+		public Assignment getTextAssignment_2() { return cTextAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getTextStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cTextStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+
+		//(hasType?="type" textType=StatemachineLineDisplayTextType)?
+		public Group getGroup_3() { return cGroup_3; }
+
+		//hasType?="type"
+		public Assignment getHasTypeAssignment_3_0() { return cHasTypeAssignment_3_0; }
+
+		//"type"
+		public Keyword getHasTypeTypeKeyword_3_0_0() { return cHasTypeTypeKeyword_3_0_0; }
+
+		//textType=StatemachineLineDisplayTextType
+		public Assignment getTextTypeAssignment_3_1() { return cTextTypeAssignment_3_1; }
+
+		//StatemachineLineDisplayTextType
+		public RuleCall getTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_3_1_0() { return cTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_3_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_4() { return cCommercialAtKeyword_4; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_5() { return cDeviceAssignment_5; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_5_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_5_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_5_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_5_0_1; }
+	}
+
+	public class StatemachineActionPeripheralDisplayTextAtElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralDisplayTextAt");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDisplayTextAtKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cTextAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTextStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cTextAssignment_2.eContents().get(0);
+		private final Keyword cRowKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cRowAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cRowINTTerminalRuleCall_4_0 = (RuleCall)cRowAssignment_4.eContents().get(0);
+		private final Keyword cColumnKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cColumnAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cColumnINTTerminalRuleCall_6_0 = (RuleCall)cColumnAssignment_6.eContents().get(0);
+		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
+		private final Assignment cHasTypeAssignment_7_0 = (Assignment)cGroup_7.eContents().get(0);
+		private final Keyword cHasTypeTypeKeyword_7_0_0 = (Keyword)cHasTypeAssignment_7_0.eContents().get(0);
+		private final Assignment cTextTypeAssignment_7_1 = (Assignment)cGroup_7.eContents().get(1);
+		private final RuleCall cTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_7_1_0 = (RuleCall)cTextTypeAssignment_7_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		private final Assignment cDeviceAssignment_9 = (Assignment)cGroup.eContents().get(9);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_9_0 = (CrossReference)cDeviceAssignment_9.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_9_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_9_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralDisplayTextAt:
+		//	"displayTextAt" "text" text=StatemachineActionFieldConcatenation "row" row=INT "column" column=INT (hasType?="type"
+		//	textType=StatemachineLineDisplayTextType)? "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"displayTextAt" "text" text=StatemachineActionFieldConcatenation "row" row=INT "column" column=INT (hasType?="type"
+		//textType=StatemachineLineDisplayTextType)? "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"displayTextAt"
+		public Keyword getDisplayTextAtKeyword_0() { return cDisplayTextAtKeyword_0; }
+
+		//"text"
+		public Keyword getTextKeyword_1() { return cTextKeyword_1; }
+
+		//text=StatemachineActionFieldConcatenation
+		public Assignment getTextAssignment_2() { return cTextAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getTextStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cTextStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+
+		//"row"
+		public Keyword getRowKeyword_3() { return cRowKeyword_3; }
+
+		//row=INT
+		public Assignment getRowAssignment_4() { return cRowAssignment_4; }
+
+		//INT
+		public RuleCall getRowINTTerminalRuleCall_4_0() { return cRowINTTerminalRuleCall_4_0; }
+
+		//"column"
+		public Keyword getColumnKeyword_5() { return cColumnKeyword_5; }
+
+		//column=INT
+		public Assignment getColumnAssignment_6() { return cColumnAssignment_6; }
+
+		//INT
+		public RuleCall getColumnINTTerminalRuleCall_6_0() { return cColumnINTTerminalRuleCall_6_0; }
+
+		//(hasType?="type" textType=StatemachineLineDisplayTextType)?
+		public Group getGroup_7() { return cGroup_7; }
+
+		//hasType?="type"
+		public Assignment getHasTypeAssignment_7_0() { return cHasTypeAssignment_7_0; }
+
+		//"type"
+		public Keyword getHasTypeTypeKeyword_7_0_0() { return cHasTypeTypeKeyword_7_0_0; }
+
+		//textType=StatemachineLineDisplayTextType
+		public Assignment getTextTypeAssignment_7_1() { return cTextTypeAssignment_7_1; }
+
+		//StatemachineLineDisplayTextType
+		public RuleCall getTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_7_1_0() { return cTextTypeStatemachineLineDisplayTextTypeEnumRuleCall_7_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_8() { return cCommercialAtKeyword_8; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_9() { return cDeviceAssignment_9; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_9_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_9_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_9_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_9_0_1; }
+	}
+
+	public class StatemachineActionPeripheralInterCharacterWaitElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralInterCharacterWait");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cInterCharacterWaitKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cWaitAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cWaitINTTerminalRuleCall_1_0 = (RuleCall)cWaitAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDeviceAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0 = (CrossReference)cDeviceAssignment_3.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralInterCharacterWait:
+		//	"interCharacterWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"interCharacterWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"interCharacterWait"
+		public Keyword getInterCharacterWaitKeyword_0() { return cInterCharacterWaitKeyword_0; }
+
+		//wait=INT
+		public Assignment getWaitAssignment_1() { return cWaitAssignment_1; }
+
+		//INT
+		public RuleCall getWaitINTTerminalRuleCall_1_0() { return cWaitINTTerminalRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_3() { return cDeviceAssignment_3; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionPeripheralMarqueeFormatElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralMarqueeFormat");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cMarqueeFormatKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cFormatAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cFormatStatemachineLineDisplayMarqueeFormatEnumRuleCall_1_0 = (RuleCall)cFormatAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDeviceAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0 = (CrossReference)cDeviceAssignment_3.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralMarqueeFormat:
+		//	"marqueeFormat" format=StatemachineLineDisplayMarqueeFormat "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"marqueeFormat" format=StatemachineLineDisplayMarqueeFormat "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"marqueeFormat"
+		public Keyword getMarqueeFormatKeyword_0() { return cMarqueeFormatKeyword_0; }
+
+		//format=StatemachineLineDisplayMarqueeFormat
+		public Assignment getFormatAssignment_1() { return cFormatAssignment_1; }
+
+		//StatemachineLineDisplayMarqueeFormat
+		public RuleCall getFormatStatemachineLineDisplayMarqueeFormatEnumRuleCall_1_0() { return cFormatStatemachineLineDisplayMarqueeFormatEnumRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_3() { return cDeviceAssignment_3; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionPeripheralMarqueeRepeatWaitElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralMarqueeRepeatWait");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cMarqueeRepeatWaitKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cWaitAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cWaitINTTerminalRuleCall_1_0 = (RuleCall)cWaitAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDeviceAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0 = (CrossReference)cDeviceAssignment_3.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralMarqueeRepeatWait:
+		//	"marqueeRepeatWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"marqueeRepeatWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"marqueeRepeatWait"
+		public Keyword getMarqueeRepeatWaitKeyword_0() { return cMarqueeRepeatWaitKeyword_0; }
+
+		//wait=INT
+		public Assignment getWaitAssignment_1() { return cWaitAssignment_1; }
+
+		//INT
+		public RuleCall getWaitINTTerminalRuleCall_1_0() { return cWaitINTTerminalRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_3() { return cDeviceAssignment_3; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionPeripheralMarqueeTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralMarqueeType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cMarqueeTypeKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cMarqueeTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cMarqueeTypeStatemachineLineDisplayMarqueeTypeEnumRuleCall_1_0 = (RuleCall)cMarqueeTypeAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDeviceAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0 = (CrossReference)cDeviceAssignment_3.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralMarqueeType:
+		//	"marqueeType" marqueeType=StatemachineLineDisplayMarqueeType "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"marqueeType" marqueeType=StatemachineLineDisplayMarqueeType "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"marqueeType"
+		public Keyword getMarqueeTypeKeyword_0() { return cMarqueeTypeKeyword_0; }
+
+		//marqueeType=StatemachineLineDisplayMarqueeType
+		public Assignment getMarqueeTypeAssignment_1() { return cMarqueeTypeAssignment_1; }
+
+		//StatemachineLineDisplayMarqueeType
+		public RuleCall getMarqueeTypeStatemachineLineDisplayMarqueeTypeEnumRuleCall_1_0() { return cMarqueeTypeStatemachineLineDisplayMarqueeTypeEnumRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_3() { return cDeviceAssignment_3; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionPeripheralMarqueeUnitWaitElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralMarqueeUnitWait");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cMarqueeUnitWaitKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cWaitAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cWaitINTTerminalRuleCall_1_0 = (RuleCall)cWaitAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDeviceAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0 = (CrossReference)cDeviceAssignment_3.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralMarqueeUnitWait:
+		//	"marqueeUnitWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"marqueeUnitWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"marqueeUnitWait"
+		public Keyword getMarqueeUnitWaitKeyword_0() { return cMarqueeUnitWaitKeyword_0; }
+
+		//wait=INT
+		public Assignment getWaitAssignment_1() { return cWaitAssignment_1; }
+
+		//INT
+		public RuleCall getWaitINTTerminalRuleCall_1_0() { return cWaitINTTerminalRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_3() { return cDeviceAssignment_3; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionPeripheralScrollElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralScroll");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cScrollKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionStatemachineLineDisplayScrollTextTypeEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cUnitsAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnitsINTTerminalRuleCall_2_0 = (RuleCall)cUnitsAssignment_2.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDeviceAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0 = (CrossReference)cDeviceAssignment_4.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_4_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralScroll:
+		//	"scroll" direction=StatemachineLineDisplayScrollTextType units=INT "@"
+		//	device=[StatemachinePeripheralDeviceLineDisplay];
+		public ParserRule getRule() { return rule; }
+
+		//"scroll" direction=StatemachineLineDisplayScrollTextType units=INT "@" device=[StatemachinePeripheralDeviceLineDisplay]
+		public Group getGroup() { return cGroup; }
+
+		//"scroll"
+		public Keyword getScrollKeyword_0() { return cScrollKeyword_0; }
+
+		//direction=StatemachineLineDisplayScrollTextType
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+
+		//StatemachineLineDisplayScrollTextType
+		public RuleCall getDirectionStatemachineLineDisplayScrollTextTypeEnumRuleCall_1_0() { return cDirectionStatemachineLineDisplayScrollTextTypeEnumRuleCall_1_0; }
+
+		//units=INT
+		public Assignment getUnitsAssignment_2() { return cUnitsAssignment_2; }
+
+		//INT
+		public RuleCall getUnitsINTTerminalRuleCall_2_0() { return cUnitsINTTerminalRuleCall_2_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_3() { return cCommercialAtKeyword_3; }
+
+		//device=[StatemachinePeripheralDeviceLineDisplay]
+		public Assignment getDeviceAssignment_4() { return cDeviceAssignment_4; }
+
+		//[StatemachinePeripheralDeviceLineDisplay]
+		public CrossReference getDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0() { return cDeviceStatemachinePeripheralDeviceLineDisplayCrossReference_4_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_4_0_1() { return cDeviceStatemachinePeripheralDeviceLineDisplayIDTerminalRuleCall_4_0_1; }
+	}
+
+	public class StatemachineActionPeripheralOpenDrawerElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralOpenDrawer");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cOpenDrawerKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cDeviceAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cDeviceStatemachinePeripheralDeviceCashDrawerCrossReference_1_0 = (CrossReference)cDeviceAssignment_1.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDeviceCashDrawerIDTerminalRuleCall_1_0_1 = (RuleCall)cDeviceStatemachinePeripheralDeviceCashDrawerCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralOpenDrawer:
+		//	"openDrawer" device=[StatemachinePeripheralDeviceCashDrawer];
+		public ParserRule getRule() { return rule; }
+
+		//"openDrawer" device=[StatemachinePeripheralDeviceCashDrawer]
+		public Group getGroup() { return cGroup; }
+
+		//"openDrawer"
+		public Keyword getOpenDrawerKeyword_0() { return cOpenDrawerKeyword_0; }
+
+		//device=[StatemachinePeripheralDeviceCashDrawer]
+		public Assignment getDeviceAssignment_1() { return cDeviceAssignment_1; }
+
+		//[StatemachinePeripheralDeviceCashDrawer]
+		public CrossReference getDeviceStatemachinePeripheralDeviceCashDrawerCrossReference_1_0() { return cDeviceStatemachinePeripheralDeviceCashDrawerCrossReference_1_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDeviceCashDrawerIDTerminalRuleCall_1_0_1() { return cDeviceStatemachinePeripheralDeviceCashDrawerIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPrintBarcodeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPrintBarcode");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPrintBarcodeKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cDataKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDataAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cDataSTRINGTerminalRuleCall_2_0 = (RuleCall)cDataAssignment_2.eContents().get(0);
+		private final Keyword cBarcodeTypeKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cBarcodeTypeAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cBarcodeTypeStatemachinePOSPrinterBarcodeTypeEnumRuleCall_4_0 = (RuleCall)cBarcodeTypeAssignment_4.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cDeviceAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0 = (CrossReference)cDeviceAssignment_6.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_6_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPrintBarcode:
+		//	"printBarcode" "data" data=STRING "barcodeType" barcodeType=StatemachinePOSPrinterBarcodeType "@"
+		//	device=[StatemachinePeripheralDevicePOSPrinter];
+		public ParserRule getRule() { return rule; }
+
+		//"printBarcode" "data" data=STRING "barcodeType" barcodeType=StatemachinePOSPrinterBarcodeType "@"
+		//device=[StatemachinePeripheralDevicePOSPrinter]
+		public Group getGroup() { return cGroup; }
+
+		//"printBarcode"
+		public Keyword getPrintBarcodeKeyword_0() { return cPrintBarcodeKeyword_0; }
+
+		//"data"
+		public Keyword getDataKeyword_1() { return cDataKeyword_1; }
+
+		//data=STRING
+		public Assignment getDataAssignment_2() { return cDataAssignment_2; }
+
+		//STRING
+		public RuleCall getDataSTRINGTerminalRuleCall_2_0() { return cDataSTRINGTerminalRuleCall_2_0; }
+
+		//"barcodeType"
+		public Keyword getBarcodeTypeKeyword_3() { return cBarcodeTypeKeyword_3; }
+
+		//barcodeType=StatemachinePOSPrinterBarcodeType
+		public Assignment getBarcodeTypeAssignment_4() { return cBarcodeTypeAssignment_4; }
+
+		//StatemachinePOSPrinterBarcodeType
+		public RuleCall getBarcodeTypeStatemachinePOSPrinterBarcodeTypeEnumRuleCall_4_0() { return cBarcodeTypeStatemachinePOSPrinterBarcodeTypeEnumRuleCall_4_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_5() { return cCommercialAtKeyword_5; }
+
+		//device=[StatemachinePeripheralDevicePOSPrinter]
+		public Assignment getDeviceAssignment_6() { return cDeviceAssignment_6; }
+
+		//[StatemachinePeripheralDevicePOSPrinter]
+		public CrossReference getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0() { return cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_6_0_1() { return cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_6_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPrintBitmapElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPrintBitmap");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPrintBitmapKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cIdKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cBitmapIdAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBitmapIdINTTerminalRuleCall_2_0 = (RuleCall)cBitmapIdAssignment_2.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDeviceAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0 = (CrossReference)cDeviceAssignment_4.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPrintBitmap:
+		//	"printBitmap" "id" bitmapId=INT "@" device=[StatemachinePeripheralDevicePOSPrinter];
+		public ParserRule getRule() { return rule; }
+
+		//"printBitmap" "id" bitmapId=INT "@" device=[StatemachinePeripheralDevicePOSPrinter]
+		public Group getGroup() { return cGroup; }
+
+		//"printBitmap"
+		public Keyword getPrintBitmapKeyword_0() { return cPrintBitmapKeyword_0; }
+
+		//"id"
+		public Keyword getIdKeyword_1() { return cIdKeyword_1; }
+
+		//bitmapId=INT
+		public Assignment getBitmapIdAssignment_2() { return cBitmapIdAssignment_2; }
+
+		//INT
+		public RuleCall getBitmapIdINTTerminalRuleCall_2_0() { return cBitmapIdINTTerminalRuleCall_2_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_3() { return cCommercialAtKeyword_3; }
+
+		//device=[StatemachinePeripheralDevicePOSPrinter]
+		public Assignment getDeviceAssignment_4() { return cDeviceAssignment_4; }
+
+		//[StatemachinePeripheralDevicePOSPrinter]
+		public CrossReference getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0() { return cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1() { return cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPrintCutElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPrintCut");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPrintCutKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cTextAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTextStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cTextAssignment_2.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDeviceAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0 = (CrossReference)cDeviceAssignment_4.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPrintCut:
+		//	"printCut" "text" text=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePOSPrinter];
+		public ParserRule getRule() { return rule; }
+
+		//"printCut" "text" text=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePOSPrinter]
+		public Group getGroup() { return cGroup; }
+
+		//"printCut"
+		public Keyword getPrintCutKeyword_0() { return cPrintCutKeyword_0; }
+
+		//"text"
+		public Keyword getTextKeyword_1() { return cTextKeyword_1; }
+
+		//text=StatemachineActionFieldConcatenation
+		public Assignment getTextAssignment_2() { return cTextAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getTextStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cTextStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_3() { return cCommercialAtKeyword_3; }
+
+		//device=[StatemachinePeripheralDevicePOSPrinter]
+		public Assignment getDeviceAssignment_4() { return cDeviceAssignment_4; }
+
+		//[StatemachinePeripheralDevicePOSPrinter]
+		public CrossReference getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0() { return cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1() { return cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPrintNormalElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPrintNormal");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPrintNormalKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cTextAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTextStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cTextAssignment_2.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDeviceAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0 = (CrossReference)cDeviceAssignment_4.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPrintNormal:
+		//	"printNormal" "text" text=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePOSPrinter];
+		public ParserRule getRule() { return rule; }
+
+		//"printNormal" "text" text=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePOSPrinter]
+		public Group getGroup() { return cGroup; }
+
+		//"printNormal"
+		public Keyword getPrintNormalKeyword_0() { return cPrintNormalKeyword_0; }
+
+		//"text"
+		public Keyword getTextKeyword_1() { return cTextKeyword_1; }
+
+		//text=StatemachineActionFieldConcatenation
+		public Assignment getTextAssignment_2() { return cTextAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getTextStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cTextStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_3() { return cCommercialAtKeyword_3; }
+
+		//device=[StatemachinePeripheralDevicePOSPrinter]
+		public Assignment getDeviceAssignment_4() { return cDeviceAssignment_4; }
+
+		//[StatemachinePeripheralDevicePOSPrinter]
+		public CrossReference getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0() { return cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_4_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1() { return cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_4_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPrintRegisterBitmapElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPrintRegisterBitmap");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cRegisterBitmapKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cIdKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cBitmapIdAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBitmapIdINTTerminalRuleCall_2_0 = (RuleCall)cBitmapIdAssignment_2.eContents().get(0);
+		private final Keyword cNameKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cNameSTRINGTerminalRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cDeviceAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0 = (CrossReference)cDeviceAssignment_6.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_6_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPrintRegisterBitmap:
+		//	"registerBitmap" "id" bitmapId=INT "name" name=STRING "@" device=[StatemachinePeripheralDevicePOSPrinter];
+		public ParserRule getRule() { return rule; }
+
+		//"registerBitmap" "id" bitmapId=INT "name" name=STRING "@" device=[StatemachinePeripheralDevicePOSPrinter]
+		public Group getGroup() { return cGroup; }
+
+		//"registerBitmap"
+		public Keyword getRegisterBitmapKeyword_0() { return cRegisterBitmapKeyword_0; }
+
+		//"id"
+		public Keyword getIdKeyword_1() { return cIdKeyword_1; }
+
+		//bitmapId=INT
+		public Assignment getBitmapIdAssignment_2() { return cBitmapIdAssignment_2; }
+
+		//INT
+		public RuleCall getBitmapIdINTTerminalRuleCall_2_0() { return cBitmapIdINTTerminalRuleCall_2_0; }
+
+		//"name"
+		public Keyword getNameKeyword_3() { return cNameKeyword_3; }
+
+		//name=STRING
+		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
+
+		//STRING
+		public RuleCall getNameSTRINGTerminalRuleCall_4_0() { return cNameSTRINGTerminalRuleCall_4_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_5() { return cCommercialAtKeyword_5; }
+
+		//device=[StatemachinePeripheralDevicePOSPrinter]
+		public Assignment getDeviceAssignment_6() { return cDeviceAssignment_6; }
+
+		//[StatemachinePeripheralDevicePOSPrinter]
+		public CrossReference getDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0() { return cDeviceStatemachinePeripheralDevicePOSPrinterCrossReference_6_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_6_0_1() { return cDeviceStatemachinePeripheralDevicePOSPrinterIDTerminalRuleCall_6_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPTOpenElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPTOpen");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPaymentOpenKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cHostKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cHostAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cHostStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cHostAssignment_2.eContents().get(0);
+		private final Keyword cPortKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cPortAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cPortStatemachineActionFieldConcatenationParserRuleCall_4_0 = (RuleCall)cPortAssignment_4.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cDeviceAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePTCrossReference_6_0 = (CrossReference)cDeviceAssignment_6.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePTCrossReference_6_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPTOpen:
+		//	"paymentOpen" "host" host=StatemachineActionFieldConcatenation "port" port=StatemachineActionFieldConcatenation "@"
+		//	device=[StatemachinePeripheralDevicePT];
+		public ParserRule getRule() { return rule; }
+
+		//"paymentOpen" "host" host=StatemachineActionFieldConcatenation "port" port=StatemachineActionFieldConcatenation "@"
+		//device=[StatemachinePeripheralDevicePT]
+		public Group getGroup() { return cGroup; }
+
+		//"paymentOpen"
+		public Keyword getPaymentOpenKeyword_0() { return cPaymentOpenKeyword_0; }
+
+		//"host"
+		public Keyword getHostKeyword_1() { return cHostKeyword_1; }
+
+		//host=StatemachineActionFieldConcatenation
+		public Assignment getHostAssignment_2() { return cHostAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getHostStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cHostStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+
+		//"port"
+		public Keyword getPortKeyword_3() { return cPortKeyword_3; }
+
+		//port=StatemachineActionFieldConcatenation
+		public Assignment getPortAssignment_4() { return cPortAssignment_4; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getPortStatemachineActionFieldConcatenationParserRuleCall_4_0() { return cPortStatemachineActionFieldConcatenationParserRuleCall_4_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_5() { return cCommercialAtKeyword_5; }
+
+		//device=[StatemachinePeripheralDevicePT]
+		public Assignment getDeviceAssignment_6() { return cDeviceAssignment_6; }
+
+		//[StatemachinePeripheralDevicePT]
+		public CrossReference getDeviceStatemachinePeripheralDevicePTCrossReference_6_0() { return cDeviceStatemachinePeripheralDevicePTCrossReference_6_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1() { return cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPTCloseElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPTClose");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPaymentCloseKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDeviceAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePTCrossReference_2_0 = (CrossReference)cDeviceAssignment_2.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePTCrossReference_2_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPTClose:
+		//	"paymentClose" "@" device=[StatemachinePeripheralDevicePT];
+		public ParserRule getRule() { return rule; }
+
+		//"paymentClose" "@" device=[StatemachinePeripheralDevicePT]
+		public Group getGroup() { return cGroup; }
+
+		//"paymentClose"
+		public Keyword getPaymentCloseKeyword_0() { return cPaymentCloseKeyword_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_1() { return cCommercialAtKeyword_1; }
+
+		//device=[StatemachinePeripheralDevicePT]
+		public Assignment getDeviceAssignment_2() { return cDeviceAssignment_2; }
+
+		//[StatemachinePeripheralDevicePT]
+		public CrossReference getDeviceStatemachinePeripheralDevicePTCrossReference_2_0() { return cDeviceStatemachinePeripheralDevicePTCrossReference_2_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1() { return cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPTAcknowledgeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPTAcknowledge");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPaymentAcknowledgeKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDeviceAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePTCrossReference_2_0 = (CrossReference)cDeviceAssignment_2.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePTCrossReference_2_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPTAcknowledge:
+		//	"paymentAcknowledge" "@" device=[StatemachinePeripheralDevicePT];
+		public ParserRule getRule() { return rule; }
+
+		//"paymentAcknowledge" "@" device=[StatemachinePeripheralDevicePT]
+		public Group getGroup() { return cGroup; }
+
+		//"paymentAcknowledge"
+		public Keyword getPaymentAcknowledgeKeyword_0() { return cPaymentAcknowledgeKeyword_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_1() { return cCommercialAtKeyword_1; }
+
+		//device=[StatemachinePeripheralDevicePT]
+		public Assignment getDeviceAssignment_2() { return cDeviceAssignment_2; }
+
+		//[StatemachinePeripheralDevicePT]
+		public CrossReference getDeviceStatemachinePeripheralDevicePTCrossReference_2_0() { return cDeviceStatemachinePeripheralDevicePTCrossReference_2_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1() { return cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPTReversalElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPTReversal");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPaymentReversalKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cWithPasswordKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cPasswordAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cPasswordAssignment_2.eContents().get(0);
+		private final Keyword cOfReceiptKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cReceiptAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cReceiptStatemachineActionFieldConcatenationParserRuleCall_4_0 = (RuleCall)cReceiptAssignment_4.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cDeviceAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePTCrossReference_6_0 = (CrossReference)cDeviceAssignment_6.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePTCrossReference_6_0.eContents().get(1);
+		
+		////StatemachineActionPeripheralPTBalanceRequest:
+		////	'balanceRequest' '@' device=[StatemachinePeripheralDevicePT];
+		////StatemachineActionPeripheralPTPrepaidTopUp:
+		////	'prepaidTopUp' 'of' source=StatemachineActionFieldConcatenation '@' device=[StatemachinePeripheralDevicePT];
+		//StatemachineActionPeripheralPTReversal:
+		//	"paymentReversal" "withPassword" password=StatemachineActionFieldConcatenation "ofReceipt"
+		//	receipt=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePT];
+		public ParserRule getRule() { return rule; }
+
+		//"paymentReversal" "withPassword" password=StatemachineActionFieldConcatenation "ofReceipt"
+		//receipt=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePT]
+		public Group getGroup() { return cGroup; }
+
+		//"paymentReversal"
+		public Keyword getPaymentReversalKeyword_0() { return cPaymentReversalKeyword_0; }
+
+		//"withPassword"
+		public Keyword getWithPasswordKeyword_1() { return cWithPasswordKeyword_1; }
+
+		//password=StatemachineActionFieldConcatenation
+		public Assignment getPasswordAssignment_2() { return cPasswordAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+
+		//"ofReceipt"
+		public Keyword getOfReceiptKeyword_3() { return cOfReceiptKeyword_3; }
+
+		//receipt=StatemachineActionFieldConcatenation
+		public Assignment getReceiptAssignment_4() { return cReceiptAssignment_4; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getReceiptStatemachineActionFieldConcatenationParserRuleCall_4_0() { return cReceiptStatemachineActionFieldConcatenationParserRuleCall_4_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_5() { return cCommercialAtKeyword_5; }
+
+		//device=[StatemachinePeripheralDevicePT]
+		public Assignment getDeviceAssignment_6() { return cDeviceAssignment_6; }
+
+		//[StatemachinePeripheralDevicePT]
+		public CrossReference getDeviceStatemachinePeripheralDevicePTCrossReference_6_0() { return cDeviceStatemachinePeripheralDevicePTCrossReference_6_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1() { return cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPTRegistrationElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPTRegistration");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPaymentRegistrationKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cWithPasswordKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cPasswordAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cPasswordAssignment_2.eContents().get(0);
+		private final Keyword cConfigurationKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cConfigurationAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cConfigurationSTRINGTerminalRuleCall_4_0 = (RuleCall)cConfigurationAssignment_4.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cDeviceAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePTCrossReference_6_0 = (CrossReference)cDeviceAssignment_6.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePTCrossReference_6_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPTRegistration:
+		//	"paymentRegistration" "withPassword" password=StatemachineActionFieldConcatenation "configuration"
+		//	configuration=STRING "@" device=[StatemachinePeripheralDevicePT];
+		public ParserRule getRule() { return rule; }
+
+		//"paymentRegistration" "withPassword" password=StatemachineActionFieldConcatenation "configuration" configuration=STRING
+		//"@" device=[StatemachinePeripheralDevicePT]
+		public Group getGroup() { return cGroup; }
+
+		//"paymentRegistration"
+		public Keyword getPaymentRegistrationKeyword_0() { return cPaymentRegistrationKeyword_0; }
+
+		//"withPassword"
+		public Keyword getWithPasswordKeyword_1() { return cWithPasswordKeyword_1; }
+
+		//password=StatemachineActionFieldConcatenation
+		public Assignment getPasswordAssignment_2() { return cPasswordAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cPasswordStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+
+		//"configuration"
+		public Keyword getConfigurationKeyword_3() { return cConfigurationKeyword_3; }
+
+		//configuration=STRING
+		public Assignment getConfigurationAssignment_4() { return cConfigurationAssignment_4; }
+
+		//STRING
+		public RuleCall getConfigurationSTRINGTerminalRuleCall_4_0() { return cConfigurationSTRINGTerminalRuleCall_4_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_5() { return cCommercialAtKeyword_5; }
+
+		//device=[StatemachinePeripheralDevicePT]
+		public Assignment getDeviceAssignment_6() { return cDeviceAssignment_6; }
+
+		//[StatemachinePeripheralDevicePT]
+		public CrossReference getDeviceStatemachinePeripheralDevicePTCrossReference_6_0() { return cDeviceStatemachinePeripheralDevicePTCrossReference_6_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1() { return cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_6_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPTAuthorizationElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPTAuthorization");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPaymentAuthorizationKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cOfAmountKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cAmountAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cAmountStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cAmountAssignment_2.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDeviceAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePTCrossReference_4_0 = (CrossReference)cDeviceAssignment_4.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_4_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePTCrossReference_4_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPTAuthorization:
+		//	"paymentAuthorization" "ofAmount" amount=StatemachineActionFieldConcatenation "@"
+		//	device=[StatemachinePeripheralDevicePT];
+		public ParserRule getRule() { return rule; }
+
+		//"paymentAuthorization" "ofAmount" amount=StatemachineActionFieldConcatenation "@"
+		//device=[StatemachinePeripheralDevicePT]
+		public Group getGroup() { return cGroup; }
+
+		//"paymentAuthorization"
+		public Keyword getPaymentAuthorizationKeyword_0() { return cPaymentAuthorizationKeyword_0; }
+
+		//"ofAmount"
+		public Keyword getOfAmountKeyword_1() { return cOfAmountKeyword_1; }
+
+		//amount=StatemachineActionFieldConcatenation
+		public Assignment getAmountAssignment_2() { return cAmountAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getAmountStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cAmountStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_3() { return cCommercialAtKeyword_3; }
+
+		//device=[StatemachinePeripheralDevicePT]
+		public Assignment getDeviceAssignment_4() { return cDeviceAssignment_4; }
+
+		//[StatemachinePeripheralDevicePT]
+		public CrossReference getDeviceStatemachinePeripheralDevicePTCrossReference_4_0() { return cDeviceStatemachinePeripheralDevicePTCrossReference_4_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_4_0_1() { return cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_4_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPTResponseElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPTResponse");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPaymentResponseKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cFromKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDeviceAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cDeviceStatemachinePeripheralDevicePTCrossReference_2_0 = (CrossReference)cDeviceAssignment_2.eContents().get(0);
+		private final RuleCall cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1 = (RuleCall)cDeviceStatemachinePeripheralDevicePTCrossReference_2_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPTResponse:
+		//	"paymentResponse" "from" device=[StatemachinePeripheralDevicePT];
+		public ParserRule getRule() { return rule; }
+
+		//"paymentResponse" "from" device=[StatemachinePeripheralDevicePT]
+		public Group getGroup() { return cGroup; }
+
+		//"paymentResponse"
+		public Keyword getPaymentResponseKeyword_0() { return cPaymentResponseKeyword_0; }
+
+		//"from"
+		public Keyword getFromKeyword_1() { return cFromKeyword_1; }
+
+		//device=[StatemachinePeripheralDevicePT]
+		public Assignment getDeviceAssignment_2() { return cDeviceAssignment_2; }
+
+		//[StatemachinePeripheralDevicePT]
+		public CrossReference getDeviceStatemachinePeripheralDevicePTCrossReference_2_0() { return cDeviceStatemachinePeripheralDevicePTCrossReference_2_0; }
+
+		//ID
+		public RuleCall getDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1() { return cDeviceStatemachinePeripheralDevicePTIDTerminalRuleCall_2_0_1; }
+	}
+
+	public class StatemachineActionPeripheralPrintReportElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionPeripheralPrintReport");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPrintReportKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cReportAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cReportReportCrossReference_1_0 = (CrossReference)cReportAssignment_1.eContents().get(0);
+		private final RuleCall cReportReportIDTerminalRuleCall_1_0_1 = (RuleCall)cReportReportCrossReference_1_0.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Assignment cHasFilterAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final Keyword cHasFilterFromKeyword_2_0_0 = (Keyword)cHasFilterAssignment_2_0.eContents().get(0);
+		private final Assignment cKeyAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final CrossReference cKeyStatemachineStorageCrossReference_2_1_0 = (CrossReference)cKeyAssignment_2_1.eContents().get(0);
+		private final RuleCall cKeyStatemachineStorageIDTerminalRuleCall_2_1_0_1 = (RuleCall)cKeyStatemachineStorageCrossReference_2_1_0.eContents().get(1);
+		
+		//StatemachineActionPeripheralPrintReport:
+		//	"printReport" report=[report::Report] (hasFilter?="from" key=[StatemachineStorage])?;
+		public ParserRule getRule() { return rule; }
+
+		//"printReport" report=[report::Report] (hasFilter?="from" key=[StatemachineStorage])?
+		public Group getGroup() { return cGroup; }
+
+		//"printReport"
+		public Keyword getPrintReportKeyword_0() { return cPrintReportKeyword_0; }
+
+		//report=[report::Report]
+		public Assignment getReportAssignment_1() { return cReportAssignment_1; }
+
+		//[report::Report]
+		public CrossReference getReportReportCrossReference_1_0() { return cReportReportCrossReference_1_0; }
+
+		//ID
+		public RuleCall getReportReportIDTerminalRuleCall_1_0_1() { return cReportReportIDTerminalRuleCall_1_0_1; }
+
+		//(hasFilter?="from" key=[StatemachineStorage])?
+		public Group getGroup_2() { return cGroup_2; }
+
+		//hasFilter?="from"
+		public Assignment getHasFilterAssignment_2_0() { return cHasFilterAssignment_2_0; }
+
+		//"from"
+		public Keyword getHasFilterFromKeyword_2_0_0() { return cHasFilterFromKeyword_2_0_0; }
+
+		//key=[StatemachineStorage]
+		public Assignment getKeyAssignment_2_1() { return cKeyAssignment_2_1; }
+
+		//[StatemachineStorage]
+		public CrossReference getKeyStatemachineStorageCrossReference_2_1_0() { return cKeyStatemachineStorageCrossReference_2_1_0; }
+
+		//ID
+		public RuleCall getKeyStatemachineStorageIDTerminalRuleCall_2_1_0_1() { return cKeyStatemachineStorageIDTerminalRuleCall_2_1_0_1; }
+	}
+
+	public class StatemachineActionFieldSourceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSource");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cStatemachineActionFieldSourceStringParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStatemachineActionFieldSourceNumberParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cStatemachineActionFieldSourceEvaluateParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cStatemachineActionFieldSourceTranslateParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cStatemachineActionFieldGetParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cStatemachineFunctionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cStatemachineStorageRetrieveParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cStatemachineActionFieldSourceDtoAttributeParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cStatemachineActionFieldSourceEventParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
+		private final RuleCall cStatemachineActionPeripheralPTResponseParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
+		
+		//// fields
+		//StatemachineActionFieldSource:
+		//	StatemachineActionFieldSourceString | StatemachineActionFieldSourceNumber | StatemachineActionFieldSourceEvaluate |
+		//	StatemachineActionFieldSourceTranslate | StatemachineActionFieldGet | StatemachineFunction |
+		//	StatemachineStorageRetrieve | StatemachineActionFieldSourceDtoAttribute | StatemachineActionFieldSourceEvent |
+		//	StatemachineActionPeripheralPTResponse;
+		public ParserRule getRule() { return rule; }
+
+		//StatemachineActionFieldSourceString | StatemachineActionFieldSourceNumber | StatemachineActionFieldSourceEvaluate |
+		//StatemachineActionFieldSourceTranslate | StatemachineActionFieldGet | StatemachineFunction |
+		//StatemachineStorageRetrieve | StatemachineActionFieldSourceDtoAttribute | StatemachineActionFieldSourceEvent |
+		//StatemachineActionPeripheralPTResponse
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//StatemachineActionFieldSourceString
+		public RuleCall getStatemachineActionFieldSourceStringParserRuleCall_0() { return cStatemachineActionFieldSourceStringParserRuleCall_0; }
+
+		//StatemachineActionFieldSourceNumber
+		public RuleCall getStatemachineActionFieldSourceNumberParserRuleCall_1() { return cStatemachineActionFieldSourceNumberParserRuleCall_1; }
+
+		//StatemachineActionFieldSourceEvaluate
+		public RuleCall getStatemachineActionFieldSourceEvaluateParserRuleCall_2() { return cStatemachineActionFieldSourceEvaluateParserRuleCall_2; }
+
+		//StatemachineActionFieldSourceTranslate
+		public RuleCall getStatemachineActionFieldSourceTranslateParserRuleCall_3() { return cStatemachineActionFieldSourceTranslateParserRuleCall_3; }
+
+		//StatemachineActionFieldGet
+		public RuleCall getStatemachineActionFieldGetParserRuleCall_4() { return cStatemachineActionFieldGetParserRuleCall_4; }
+
+		//StatemachineFunction
+		public RuleCall getStatemachineFunctionParserRuleCall_5() { return cStatemachineFunctionParserRuleCall_5; }
+
+		//StatemachineStorageRetrieve
+		public RuleCall getStatemachineStorageRetrieveParserRuleCall_6() { return cStatemachineStorageRetrieveParserRuleCall_6; }
+
+		//StatemachineActionFieldSourceDtoAttribute
+		public RuleCall getStatemachineActionFieldSourceDtoAttributeParserRuleCall_7() { return cStatemachineActionFieldSourceDtoAttributeParserRuleCall_7; }
+
+		//StatemachineActionFieldSourceEvent
+		public RuleCall getStatemachineActionFieldSourceEventParserRuleCall_8() { return cStatemachineActionFieldSourceEventParserRuleCall_8; }
+
+		//StatemachineActionPeripheralPTResponse
+		public RuleCall getStatemachineActionPeripheralPTResponseParserRuleCall_9() { return cStatemachineActionPeripheralPTResponseParserRuleCall_9; }
+	}
+
+	public class StatemachineOperationElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineOperation");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cOperationKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cOperationAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cOperationFunctionLibraryOperationCrossReference_1_0 = (CrossReference)cOperationAssignment_1.eContents().get(0);
+		private final RuleCall cOperationFunctionLibraryOperationIDTerminalRuleCall_1_0_1 = (RuleCall)cOperationFunctionLibraryOperationCrossReference_1_0.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cFirstAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cFirstStatemachineOperationParameterParserRuleCall_3_0 = (RuleCall)cFirstAssignment_3.eContents().get(0);
+		private final Assignment cMoreAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cMoreStatemachineOperationParameterMoreParserRuleCall_4_0 = (RuleCall)cMoreAssignment_4.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//StatemachineOperation:
+		//	"operation" operation=[function::FunctionLibraryOperation] "(" first=StatemachineOperationParameter?
+		//	more+=StatemachineOperationParameterMore* ")";
+		public ParserRule getRule() { return rule; }
+
+		//"operation" operation=[function::FunctionLibraryOperation] "(" first=StatemachineOperationParameter?
+		//more+=StatemachineOperationParameterMore* ")"
+		public Group getGroup() { return cGroup; }
+
+		//"operation"
+		public Keyword getOperationKeyword_0() { return cOperationKeyword_0; }
+
+		//operation=[function::FunctionLibraryOperation]
+		public Assignment getOperationAssignment_1() { return cOperationAssignment_1; }
+
+		//[function::FunctionLibraryOperation]
+		public CrossReference getOperationFunctionLibraryOperationCrossReference_1_0() { return cOperationFunctionLibraryOperationCrossReference_1_0; }
+
+		//ID
+		public RuleCall getOperationFunctionLibraryOperationIDTerminalRuleCall_1_0_1() { return cOperationFunctionLibraryOperationIDTerminalRuleCall_1_0_1; }
+
+		//"("
+		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
+
+		//first=StatemachineOperationParameter?
+		public Assignment getFirstAssignment_3() { return cFirstAssignment_3; }
+
+		//StatemachineOperationParameter
+		public RuleCall getFirstStatemachineOperationParameterParserRuleCall_3_0() { return cFirstStatemachineOperationParameterParserRuleCall_3_0; }
+
+		//more+=StatemachineOperationParameterMore*
+		public Assignment getMoreAssignment_4() { return cMoreAssignment_4; }
+
+		//StatemachineOperationParameterMore
+		public RuleCall getMoreStatemachineOperationParameterMoreParserRuleCall_4_0() { return cMoreStatemachineOperationParameterMoreParserRuleCall_4_0; }
+
+		//")"
+		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
+	}
+
+	public class StatemachineGuardElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineGuard");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cGuardKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cGuardAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cGuardFunctionLibraryGuardCrossReference_1_0 = (CrossReference)cGuardAssignment_1.eContents().get(0);
+		private final RuleCall cGuardFunctionLibraryGuardIDTerminalRuleCall_1_0_1 = (RuleCall)cGuardFunctionLibraryGuardCrossReference_1_0.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Assignment cHasOnFailAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final Keyword cHasOnFailOnFailKeyword_2_0_0 = (Keyword)cHasOnFailAssignment_2_0.eContents().get(0);
+		private final Keyword cCaptionKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Assignment cOnFailCaptionAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
+		private final RuleCall cOnFailCaptionTRANSLATABLESTRINGParserRuleCall_2_2_0 = (RuleCall)cOnFailCaptionAssignment_2_2.eContents().get(0);
+		private final Keyword cDescriptionKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
+		private final Assignment cOnFailDescriptionAssignment_2_4 = (Assignment)cGroup_2.eContents().get(4);
+		private final RuleCall cOnFailDescriptionTRANSLATABLESTRINGParserRuleCall_2_4_0 = (RuleCall)cOnFailDescriptionAssignment_2_4.eContents().get(0);
+		private final Keyword cTypeKeyword_2_5 = (Keyword)cGroup_2.eContents().get(5);
+		private final Assignment cOnFailTypeAssignment_2_6 = (Assignment)cGroup_2.eContents().get(6);
+		private final RuleCall cOnFailTypeStatemachineUserMessageTypeEnumRuleCall_2_6_0 = (RuleCall)cOnFailTypeAssignment_2_6.eContents().get(0);
+		
+		//StatemachineGuard:
+		//	"guard" guard=[function::FunctionLibraryGuard] (hasOnFail?="onFail" "caption" onFailCaption=TRANSLATABLESTRING
+		//	"description" onFailDescription=TRANSLATABLESTRING "type" onFailType=StatemachineUserMessageType)?;
+		public ParserRule getRule() { return rule; }
+
+		//"guard" guard=[function::FunctionLibraryGuard] (hasOnFail?="onFail" "caption" onFailCaption=TRANSLATABLESTRING
+		//"description" onFailDescription=TRANSLATABLESTRING "type" onFailType=StatemachineUserMessageType)?
+		public Group getGroup() { return cGroup; }
+
+		//"guard"
+		public Keyword getGuardKeyword_0() { return cGuardKeyword_0; }
+
+		//guard=[function::FunctionLibraryGuard]
+		public Assignment getGuardAssignment_1() { return cGuardAssignment_1; }
+
+		//[function::FunctionLibraryGuard]
+		public CrossReference getGuardFunctionLibraryGuardCrossReference_1_0() { return cGuardFunctionLibraryGuardCrossReference_1_0; }
+
+		//ID
+		public RuleCall getGuardFunctionLibraryGuardIDTerminalRuleCall_1_0_1() { return cGuardFunctionLibraryGuardIDTerminalRuleCall_1_0_1; }
+
+		//(hasOnFail?="onFail" "caption" onFailCaption=TRANSLATABLESTRING "description" onFailDescription=TRANSLATABLESTRING
+		//"type" onFailType=StatemachineUserMessageType)?
+		public Group getGroup_2() { return cGroup_2; }
+
+		//hasOnFail?="onFail"
+		public Assignment getHasOnFailAssignment_2_0() { return cHasOnFailAssignment_2_0; }
+
+		//"onFail"
+		public Keyword getHasOnFailOnFailKeyword_2_0_0() { return cHasOnFailOnFailKeyword_2_0_0; }
+
+		//"caption"
+		public Keyword getCaptionKeyword_2_1() { return cCaptionKeyword_2_1; }
+
+		//onFailCaption=TRANSLATABLESTRING
+		public Assignment getOnFailCaptionAssignment_2_2() { return cOnFailCaptionAssignment_2_2; }
+
+		//TRANSLATABLESTRING
+		public RuleCall getOnFailCaptionTRANSLATABLESTRINGParserRuleCall_2_2_0() { return cOnFailCaptionTRANSLATABLESTRINGParserRuleCall_2_2_0; }
+
+		//"description"
+		public Keyword getDescriptionKeyword_2_3() { return cDescriptionKeyword_2_3; }
+
+		//onFailDescription=TRANSLATABLESTRING
+		public Assignment getOnFailDescriptionAssignment_2_4() { return cOnFailDescriptionAssignment_2_4; }
+
+		//TRANSLATABLESTRING
+		public RuleCall getOnFailDescriptionTRANSLATABLESTRINGParserRuleCall_2_4_0() { return cOnFailDescriptionTRANSLATABLESTRINGParserRuleCall_2_4_0; }
+
+		//"type"
+		public Keyword getTypeKeyword_2_5() { return cTypeKeyword_2_5; }
+
+		//onFailType=StatemachineUserMessageType
+		public Assignment getOnFailTypeAssignment_2_6() { return cOnFailTypeAssignment_2_6; }
+
+		//StatemachineUserMessageType
+		public RuleCall getOnFailTypeStatemachineUserMessageTypeEnumRuleCall_2_6_0() { return cOnFailTypeStatemachineUserMessageTypeEnumRuleCall_2_6_0; }
+	}
+
+	public class StatemachineFunctionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineFunction");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cFunctionKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cFunctionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cFunctionFunctionLibraryFunctionCrossReference_1_0 = (CrossReference)cFunctionAssignment_1.eContents().get(0);
+		private final RuleCall cFunctionFunctionLibraryFunctionIDTerminalRuleCall_1_0_1 = (RuleCall)cFunctionFunctionLibraryFunctionCrossReference_1_0.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cFirstAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cFirstStatemachineOperationParameterParserRuleCall_3_0 = (RuleCall)cFirstAssignment_3.eContents().get(0);
+		private final Assignment cMoreAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cMoreStatemachineOperationParameterMoreParserRuleCall_4_0 = (RuleCall)cMoreAssignment_4.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//StatemachineFunction:
+		//	"function" function=[function::FunctionLibraryFunction] "(" first=StatemachineOperationParameter?
+		//	more+=StatemachineOperationParameterMore* ")";
+		public ParserRule getRule() { return rule; }
+
+		//"function" function=[function::FunctionLibraryFunction] "(" first=StatemachineOperationParameter?
+		//more+=StatemachineOperationParameterMore* ")"
+		public Group getGroup() { return cGroup; }
+
+		//"function"
+		public Keyword getFunctionKeyword_0() { return cFunctionKeyword_0; }
+
+		//function=[function::FunctionLibraryFunction]
+		public Assignment getFunctionAssignment_1() { return cFunctionAssignment_1; }
+
+		//[function::FunctionLibraryFunction]
+		public CrossReference getFunctionFunctionLibraryFunctionCrossReference_1_0() { return cFunctionFunctionLibraryFunctionCrossReference_1_0; }
+
+		//ID
+		public RuleCall getFunctionFunctionLibraryFunctionIDTerminalRuleCall_1_0_1() { return cFunctionFunctionLibraryFunctionIDTerminalRuleCall_1_0_1; }
+
+		//"("
+		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
+
+		//first=StatemachineOperationParameter?
+		public Assignment getFirstAssignment_3() { return cFirstAssignment_3; }
+
+		//StatemachineOperationParameter
+		public RuleCall getFirstStatemachineOperationParameterParserRuleCall_3_0() { return cFirstStatemachineOperationParameterParserRuleCall_3_0; }
+
+		//more+=StatemachineOperationParameterMore*
+		public Assignment getMoreAssignment_4() { return cMoreAssignment_4; }
+
+		//StatemachineOperationParameterMore
+		public RuleCall getMoreStatemachineOperationParameterMoreParserRuleCall_4_0() { return cMoreStatemachineOperationParameterMoreParserRuleCall_4_0; }
+
+		//")"
+		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
+	}
+
+	public class StatemachineStorageElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineStorage");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cStoreKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cContentAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cContentStatemachineActionFieldConcatenationParserRuleCall_1_0 = (RuleCall)cContentAssignment_1.eContents().get(0);
+		private final Keyword cWithKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cKeyAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cKeyIDTerminalRuleCall_3_0 = (RuleCall)cKeyAssignment_3.eContents().get(0);
+		private final Keyword cFullStopKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cAttributeAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cAttributeIDTerminalRuleCall_5_0 = (RuleCall)cAttributeAssignment_5.eContents().get(0);
+		
+		//StatemachineStorage:
+		//	"store" content=StatemachineActionFieldConcatenation "with" key=ID "." attribute=ID;
+		public ParserRule getRule() { return rule; }
+
+		//"store" content=StatemachineActionFieldConcatenation "with" key=ID "." attribute=ID
+		public Group getGroup() { return cGroup; }
+
+		//"store"
+		public Keyword getStoreKeyword_0() { return cStoreKeyword_0; }
+
+		//content=StatemachineActionFieldConcatenation
+		public Assignment getContentAssignment_1() { return cContentAssignment_1; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getContentStatemachineActionFieldConcatenationParserRuleCall_1_0() { return cContentStatemachineActionFieldConcatenationParserRuleCall_1_0; }
+
+		//"with"
+		public Keyword getWithKeyword_2() { return cWithKeyword_2; }
+
+		//key=ID
+		public Assignment getKeyAssignment_3() { return cKeyAssignment_3; }
+
+		//ID
+		public RuleCall getKeyIDTerminalRuleCall_3_0() { return cKeyIDTerminalRuleCall_3_0; }
+
+		//"."
+		public Keyword getFullStopKeyword_4() { return cFullStopKeyword_4; }
+
+		//attribute=ID
+		public Assignment getAttributeAssignment_5() { return cAttributeAssignment_5; }
+
+		//ID
+		public RuleCall getAttributeIDTerminalRuleCall_5_0() { return cAttributeIDTerminalRuleCall_5_0; }
+	}
+
+	public class StatemachineStorageRetrieveElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineStorageRetrieve");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cRetrieveKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cFromKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cKeyAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cKeyIDTerminalRuleCall_2_0 = (RuleCall)cKeyAssignment_2.eContents().get(0);
+		private final Keyword cFullStopKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cAttributeAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cAttributeIDTerminalRuleCall_4_0 = (RuleCall)cAttributeAssignment_4.eContents().get(0);
+		
+		//StatemachineStorageRetrieve:
+		//	"retrieve" "from" key=ID "." attribute=ID;
+		public ParserRule getRule() { return rule; }
+
+		//"retrieve" "from" key=ID "." attribute=ID
+		public Group getGroup() { return cGroup; }
+
+		//"retrieve"
+		public Keyword getRetrieveKeyword_0() { return cRetrieveKeyword_0; }
+
+		//"from"
+		public Keyword getFromKeyword_1() { return cFromKeyword_1; }
+
+		//key=ID
+		public Assignment getKeyAssignment_2() { return cKeyAssignment_2; }
+
+		//ID
+		public RuleCall getKeyIDTerminalRuleCall_2_0() { return cKeyIDTerminalRuleCall_2_0; }
+
+		//"."
+		public Keyword getFullStopKeyword_3() { return cFullStopKeyword_3; }
+
+		//attribute=ID
+		public Assignment getAttributeAssignment_4() { return cAttributeAssignment_4; }
+
+		//ID
+		public RuleCall getAttributeIDTerminalRuleCall_4_0() { return cAttributeIDTerminalRuleCall_4_0; }
+	}
+
+	public class StatemachineActionConditionalTransitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionConditionalTransition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cTransitionKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cTransitionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cTransitionStatemachineStateCrossReference_1_0 = (CrossReference)cTransitionAssignment_1.eContents().get(0);
+		private final RuleCall cTransitionStatemachineStateIDTerminalRuleCall_1_0_1 = (RuleCall)cTransitionStatemachineStateCrossReference_1_0.eContents().get(1);
+		private final Assignment cGuardAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cGuardStatemachineGuardParserRuleCall_2_0 = (RuleCall)cGuardAssignment_2.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cActionsAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cActionsStatemachineActionParserRuleCall_4_0 = (RuleCall)cActionsAssignment_4.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//StatemachineActionConditionalTransition:
+		//	"transition" transition=[StatemachineState] guard=StatemachineGuard "{" actions+=StatemachineAction* "}";
+		public ParserRule getRule() { return rule; }
+
+		//"transition" transition=[StatemachineState] guard=StatemachineGuard "{" actions+=StatemachineAction* "}"
+		public Group getGroup() { return cGroup; }
+
+		//"transition"
+		public Keyword getTransitionKeyword_0() { return cTransitionKeyword_0; }
+
+		//transition=[StatemachineState]
+		public Assignment getTransitionAssignment_1() { return cTransitionAssignment_1; }
+
+		//[StatemachineState]
+		public CrossReference getTransitionStatemachineStateCrossReference_1_0() { return cTransitionStatemachineStateCrossReference_1_0; }
+
+		//ID
+		public RuleCall getTransitionStatemachineStateIDTerminalRuleCall_1_0_1() { return cTransitionStatemachineStateIDTerminalRuleCall_1_0_1; }
+
+		//guard=StatemachineGuard
+		public Assignment getGuardAssignment_2() { return cGuardAssignment_2; }
+
+		//StatemachineGuard
+		public RuleCall getGuardStatemachineGuardParserRuleCall_2_0() { return cGuardStatemachineGuardParserRuleCall_2_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
+
+		//actions+=StatemachineAction*
+		public Assignment getActionsAssignment_4() { return cActionsAssignment_4; }
+
+		//StatemachineAction
+		public RuleCall getActionsStatemachineActionParserRuleCall_4_0() { return cActionsStatemachineActionParserRuleCall_4_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
+	}
+
+	public class StatemachineActionFieldSourceStringElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceString");
+		private final Assignment cTextAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cTextSTRINGTerminalRuleCall_0 = (RuleCall)cTextAssignment.eContents().get(0);
+		
+		//StatemachineActionFieldSourceString:
+		//	text=STRING;
+		public ParserRule getRule() { return rule; }
+
+		//text=STRING
+		public Assignment getTextAssignment() { return cTextAssignment; }
+
+		//STRING
+		public RuleCall getTextSTRINGTerminalRuleCall_0() { return cTextSTRINGTerminalRuleCall_0; }
+	}
+
+	public class StatemachineActionFieldSourceNumberElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceNumber");
+		private final Assignment cValueAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cValueSignedNumberParserRuleCall_0 = (RuleCall)cValueAssignment.eContents().get(0);
+		
+		//StatemachineActionFieldSourceNumber:
+		//	value=SignedNumber;
+		public ParserRule getRule() { return rule; }
+
+		//value=SignedNumber
+		public Assignment getValueAssignment() { return cValueAssignment; }
+
+		//SignedNumber
+		public RuleCall getValueSignedNumberParserRuleCall_0() { return cValueSignedNumberParserRuleCall_0; }
+	}
+
+	public class StatemachineActionFieldSourceEvaluateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceEvaluate");
+		private final Assignment cEvaluationtypeAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_0 = (RuleCall)cEvaluationtypeAssignment.eContents().get(0);
+		
+		//StatemachineActionFieldSourceEvaluate:
+		//	evaluationtype=StatemachineEvaluationType;
+		public ParserRule getRule() { return rule; }
+
+		//evaluationtype=StatemachineEvaluationType
+		public Assignment getEvaluationtypeAssignment() { return cEvaluationtypeAssignment; }
+
+		//StatemachineEvaluationType
+		public RuleCall getEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_0() { return cEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_0; }
+	}
+
+	public class StatemachineActionFieldSourceEventElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceEvent");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineActionFieldSourceEventAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cEventKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//StatemachineActionFieldSourceEvent:
+		//	{StatemachineActionFieldSourceEvent} "event";
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineActionFieldSourceEvent} "event"
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineActionFieldSourceEvent}
+		public Action getStatemachineActionFieldSourceEventAction_0() { return cStatemachineActionFieldSourceEventAction_0; }
+
+		//"event"
+		public Keyword getEventKeyword_1() { return cEventKeyword_1; }
+	}
+
+	public class StatemachineActionFieldSourceTranslateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceTranslate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cTranslateKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cTextAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cTextTRANSLATABLESTRINGParserRuleCall_1_0 = (RuleCall)cTextAssignment_1.eContents().get(0);
+		
+		//StatemachineActionFieldSourceTranslate:
+		//	"translate" text=TRANSLATABLESTRING;
+		public ParserRule getRule() { return rule; }
+
+		//"translate" text=TRANSLATABLESTRING
+		public Group getGroup() { return cGroup; }
+
+		//"translate"
+		public Keyword getTranslateKeyword_0() { return cTranslateKeyword_0; }
+
+		//text=TRANSLATABLESTRING
+		public Assignment getTextAssignment_1() { return cTextAssignment_1; }
+
+		//TRANSLATABLESTRING
+		public RuleCall getTextTRANSLATABLESTRINGParserRuleCall_1_0() { return cTextTRANSLATABLESTRINGParserRuleCall_1_0; }
+	}
+
+	public class StatemachineActionFieldSourceDtoAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceDtoAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDtoKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cDtoAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cDtoStatemachineControlDTOAttributeCrossReference_1_0 = (CrossReference)cDtoAssignment_1.eContents().get(0);
+		private final RuleCall cDtoStatemachineControlDTOAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cDtoStatemachineControlDTOAttributeCrossReference_1_0.eContents().get(1);
+		private final Keyword cFullStopKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cAttributeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cAttributeLDtoInheritedAttributeCrossReference_3_0 = (CrossReference)cAttributeAssignment_3.eContents().get(0);
+		private final RuleCall cAttributeLDtoInheritedAttributeIDTerminalRuleCall_3_0_1 = (RuleCall)cAttributeLDtoInheritedAttributeCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionFieldSourceDtoAttribute:
+		//	"dto" dto=[StatemachineControlDTOAttribute] "." attribute=[dto::LDtoInheritedAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"dto" dto=[StatemachineControlDTOAttribute] "." attribute=[dto::LDtoInheritedAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"dto"
+		public Keyword getDtoKeyword_0() { return cDtoKeyword_0; }
+
+		//dto=[StatemachineControlDTOAttribute]
+		public Assignment getDtoAssignment_1() { return cDtoAssignment_1; }
+
+		//[StatemachineControlDTOAttribute]
+		public CrossReference getDtoStatemachineControlDTOAttributeCrossReference_1_0() { return cDtoStatemachineControlDTOAttributeCrossReference_1_0; }
+
+		//ID
+		public RuleCall getDtoStatemachineControlDTOAttributeIDTerminalRuleCall_1_0_1() { return cDtoStatemachineControlDTOAttributeIDTerminalRuleCall_1_0_1; }
+
+		//"."
+		public Keyword getFullStopKeyword_2() { return cFullStopKeyword_2; }
+
+		//attribute=[dto::LDtoInheritedAttribute]
+		public Assignment getAttributeAssignment_3() { return cAttributeAssignment_3; }
+
+		//[dto::LDtoInheritedAttribute]
+		public CrossReference getAttributeLDtoInheritedAttributeCrossReference_3_0() { return cAttributeLDtoInheritedAttributeCrossReference_3_0; }
+
+		//ID
+		public RuleCall getAttributeLDtoInheritedAttributeIDTerminalRuleCall_3_0_1() { return cAttributeLDtoInheritedAttributeIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionFieldSourceMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceMore");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cStatemachineActionFieldSourceStringMoreParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStatemachineActionFieldSourceNumberMoreParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cStatemachineActionFieldSourceEvaluateMoreParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cStatemachineActionFieldSourceTranslateMoreParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cStatemachineActionFieldGetMoreParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cStatemachineOperationMoreParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cStatemachineStorageRetrieveMoreParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cStatemachineActionFieldSourceDtoAttributeMoreParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		
+		//StatemachineActionFieldSourceMore returns StatemachineActionFieldSource:
+		//	StatemachineActionFieldSourceStringMore | StatemachineActionFieldSourceNumberMore |
+		//	StatemachineActionFieldSourceEvaluateMore | StatemachineActionFieldSourceTranslateMore |
+		//	StatemachineActionFieldGetMore | StatemachineOperationMore | StatemachineStorageRetrieveMore |
+		//	StatemachineActionFieldSourceDtoAttributeMore;
+		public ParserRule getRule() { return rule; }
+
+		//StatemachineActionFieldSourceStringMore | StatemachineActionFieldSourceNumberMore |
+		//StatemachineActionFieldSourceEvaluateMore | StatemachineActionFieldSourceTranslateMore |
+		//StatemachineActionFieldGetMore | StatemachineOperationMore | StatemachineStorageRetrieveMore |
+		//StatemachineActionFieldSourceDtoAttributeMore
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//StatemachineActionFieldSourceStringMore
+		public RuleCall getStatemachineActionFieldSourceStringMoreParserRuleCall_0() { return cStatemachineActionFieldSourceStringMoreParserRuleCall_0; }
+
+		//StatemachineActionFieldSourceNumberMore
+		public RuleCall getStatemachineActionFieldSourceNumberMoreParserRuleCall_1() { return cStatemachineActionFieldSourceNumberMoreParserRuleCall_1; }
+
+		//StatemachineActionFieldSourceEvaluateMore
+		public RuleCall getStatemachineActionFieldSourceEvaluateMoreParserRuleCall_2() { return cStatemachineActionFieldSourceEvaluateMoreParserRuleCall_2; }
+
+		//StatemachineActionFieldSourceTranslateMore
+		public RuleCall getStatemachineActionFieldSourceTranslateMoreParserRuleCall_3() { return cStatemachineActionFieldSourceTranslateMoreParserRuleCall_3; }
+
+		//StatemachineActionFieldGetMore
+		public RuleCall getStatemachineActionFieldGetMoreParserRuleCall_4() { return cStatemachineActionFieldGetMoreParserRuleCall_4; }
+
+		//StatemachineOperationMore
+		public RuleCall getStatemachineOperationMoreParserRuleCall_5() { return cStatemachineOperationMoreParserRuleCall_5; }
+
+		//StatemachineStorageRetrieveMore
+		public RuleCall getStatemachineStorageRetrieveMoreParserRuleCall_6() { return cStatemachineStorageRetrieveMoreParserRuleCall_6; }
+
+		//StatemachineActionFieldSourceDtoAttributeMore
+		public RuleCall getStatemachineActionFieldSourceDtoAttributeMoreParserRuleCall_7() { return cStatemachineActionFieldSourceDtoAttributeMoreParserRuleCall_7; }
+	}
+
+	public class StatemachineActionFieldSourceStringMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceStringMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineActionFieldSourceStringAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPlusSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cTextAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTextSTRINGTerminalRuleCall_2_0 = (RuleCall)cTextAssignment_2.eContents().get(0);
+		
+		//StatemachineActionFieldSourceStringMore returns StatemachineActionFieldSourceString:
+		//	{StatemachineActionFieldSourceString} "+" text=STRING;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineActionFieldSourceString} "+" text=STRING
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineActionFieldSourceString}
+		public Action getStatemachineActionFieldSourceStringAction_0() { return cStatemachineActionFieldSourceStringAction_0; }
+
+		//"+"
+		public Keyword getPlusSignKeyword_1() { return cPlusSignKeyword_1; }
+
+		//text=STRING
+		public Assignment getTextAssignment_2() { return cTextAssignment_2; }
+
+		//STRING
+		public RuleCall getTextSTRINGTerminalRuleCall_2_0() { return cTextSTRINGTerminalRuleCall_2_0; }
+	}
+
+	public class StatemachineActionFieldSourceNumberMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceNumberMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineActionFieldSourceNumberAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPlusSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cValueSignedNumberParserRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
+		
+		//StatemachineActionFieldSourceNumberMore returns StatemachineActionFieldSourceNumber:
+		//	{StatemachineActionFieldSourceNumber} "+" value=SignedNumber;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineActionFieldSourceNumber} "+" value=SignedNumber
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineActionFieldSourceNumber}
+		public Action getStatemachineActionFieldSourceNumberAction_0() { return cStatemachineActionFieldSourceNumberAction_0; }
+
+		//"+"
+		public Keyword getPlusSignKeyword_1() { return cPlusSignKeyword_1; }
+
+		//value=SignedNumber
+		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
+
+		//SignedNumber
+		public RuleCall getValueSignedNumberParserRuleCall_2_0() { return cValueSignedNumberParserRuleCall_2_0; }
+	}
+
+	public class StatemachineActionFieldSourceEvaluateMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceEvaluateMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineActionFieldSourceEvaluateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPlusSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cEvaluationtypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_2_0 = (RuleCall)cEvaluationtypeAssignment_2.eContents().get(0);
+		
+		//StatemachineActionFieldSourceEvaluateMore returns StatemachineActionFieldSourceEvaluate:
+		//	{StatemachineActionFieldSourceEvaluate} "+" evaluationtype=StatemachineEvaluationType;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineActionFieldSourceEvaluate} "+" evaluationtype=StatemachineEvaluationType
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineActionFieldSourceEvaluate}
+		public Action getStatemachineActionFieldSourceEvaluateAction_0() { return cStatemachineActionFieldSourceEvaluateAction_0; }
+
+		//"+"
+		public Keyword getPlusSignKeyword_1() { return cPlusSignKeyword_1; }
+
+		//evaluationtype=StatemachineEvaluationType
+		public Assignment getEvaluationtypeAssignment_2() { return cEvaluationtypeAssignment_2; }
+
+		//StatemachineEvaluationType
+		public RuleCall getEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_2_0() { return cEvaluationtypeStatemachineEvaluationTypeEnumRuleCall_2_0; }
+	}
+
+	public class StatemachineActionFieldSourceTranslateMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceTranslateMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineActionFieldSourceTranslateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPlusSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cTranslateKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cTextAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cTextTRANSLATABLESTRINGParserRuleCall_3_0 = (RuleCall)cTextAssignment_3.eContents().get(0);
+		
+		//StatemachineActionFieldSourceTranslateMore returns StatemachineActionFieldSourceTranslate:
+		//	{StatemachineActionFieldSourceTranslate} "+" "translate" text=TRANSLATABLESTRING;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineActionFieldSourceTranslate} "+" "translate" text=TRANSLATABLESTRING
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineActionFieldSourceTranslate}
+		public Action getStatemachineActionFieldSourceTranslateAction_0() { return cStatemachineActionFieldSourceTranslateAction_0; }
+
+		//"+"
+		public Keyword getPlusSignKeyword_1() { return cPlusSignKeyword_1; }
+
+		//"translate"
+		public Keyword getTranslateKeyword_2() { return cTranslateKeyword_2; }
+
+		//text=TRANSLATABLESTRING
+		public Assignment getTextAssignment_3() { return cTextAssignment_3; }
+
+		//TRANSLATABLESTRING
+		public RuleCall getTextTRANSLATABLESTRINGParserRuleCall_3_0() { return cTextTRANSLATABLESTRINGParserRuleCall_3_0; }
+	}
+
+	public class StatemachineActionFieldGetMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldGetMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineActionFieldGetAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPlusSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cGetKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cAttributeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cAttributeStatemachineControlFieldAttributeCrossReference_3_0 = (CrossReference)cAttributeAssignment_3.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_3_0_1 = (RuleCall)cAttributeStatemachineControlFieldAttributeCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionFieldGetMore returns StatemachineActionFieldGet:
+		//	{StatemachineActionFieldGet} "+" "get" attribute=[StatemachineControlFieldAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineActionFieldGet} "+" "get" attribute=[StatemachineControlFieldAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineActionFieldGet}
+		public Action getStatemachineActionFieldGetAction_0() { return cStatemachineActionFieldGetAction_0; }
+
+		//"+"
+		public Keyword getPlusSignKeyword_1() { return cPlusSignKeyword_1; }
+
+		//"get"
+		public Keyword getGetKeyword_2() { return cGetKeyword_2; }
+
+		//attribute=[StatemachineControlFieldAttribute]
+		public Assignment getAttributeAssignment_3() { return cAttributeAssignment_3; }
+
+		//[StatemachineControlFieldAttribute]
+		public CrossReference getAttributeStatemachineControlFieldAttributeCrossReference_3_0() { return cAttributeStatemachineControlFieldAttributeCrossReference_3_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_3_0_1() { return cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineOperationMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineOperationMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineOperationAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPlusSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cOperationKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cOperationAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cOperationFunctionLibraryOperationCrossReference_3_0 = (CrossReference)cOperationAssignment_3.eContents().get(0);
+		private final RuleCall cOperationFunctionLibraryOperationIDTerminalRuleCall_3_0_1 = (RuleCall)cOperationFunctionLibraryOperationCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineOperationMore returns StatemachineOperation:
+		//	{StatemachineOperation} "+" "operation" operation=[function::FunctionLibraryOperation];
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineOperation} "+" "operation" operation=[function::FunctionLibraryOperation]
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineOperation}
+		public Action getStatemachineOperationAction_0() { return cStatemachineOperationAction_0; }
+
+		//"+"
+		public Keyword getPlusSignKeyword_1() { return cPlusSignKeyword_1; }
+
+		//"operation"
+		public Keyword getOperationKeyword_2() { return cOperationKeyword_2; }
+
+		//operation=[function::FunctionLibraryOperation]
+		public Assignment getOperationAssignment_3() { return cOperationAssignment_3; }
+
+		//[function::FunctionLibraryOperation]
+		public CrossReference getOperationFunctionLibraryOperationCrossReference_3_0() { return cOperationFunctionLibraryOperationCrossReference_3_0; }
+
+		//ID
+		public RuleCall getOperationFunctionLibraryOperationIDTerminalRuleCall_3_0_1() { return cOperationFunctionLibraryOperationIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineStorageRetrieveMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineStorageRetrieveMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineStorageRetrieveAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPlusSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cRetrieveKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Keyword cFromKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cKeyAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cKeyIDTerminalRuleCall_4_0 = (RuleCall)cKeyAssignment_4.eContents().get(0);
+		private final Keyword cFullStopKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cAttributeAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cAttributeIDTerminalRuleCall_6_0 = (RuleCall)cAttributeAssignment_6.eContents().get(0);
+		
+		//StatemachineStorageRetrieveMore returns StatemachineStorageRetrieve:
+		//	{StatemachineStorageRetrieve} "+" "retrieve" "from" key=ID "." attribute=ID;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineStorageRetrieve} "+" "retrieve" "from" key=ID "." attribute=ID
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineStorageRetrieve}
+		public Action getStatemachineStorageRetrieveAction_0() { return cStatemachineStorageRetrieveAction_0; }
+
+		//"+"
+		public Keyword getPlusSignKeyword_1() { return cPlusSignKeyword_1; }
+
+		//"retrieve"
+		public Keyword getRetrieveKeyword_2() { return cRetrieveKeyword_2; }
+
+		//"from"
+		public Keyword getFromKeyword_3() { return cFromKeyword_3; }
+
+		//key=ID
+		public Assignment getKeyAssignment_4() { return cKeyAssignment_4; }
+
+		//ID
+		public RuleCall getKeyIDTerminalRuleCall_4_0() { return cKeyIDTerminalRuleCall_4_0; }
+
+		//"."
+		public Keyword getFullStopKeyword_5() { return cFullStopKeyword_5; }
+
+		//attribute=ID
+		public Assignment getAttributeAssignment_6() { return cAttributeAssignment_6; }
+
+		//ID
+		public RuleCall getAttributeIDTerminalRuleCall_6_0() { return cAttributeIDTerminalRuleCall_6_0; }
+	}
+
+	public class StatemachineActionFieldSourceDtoAttributeMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSourceDtoAttributeMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineActionFieldSourceDtoAttributeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPlusSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cDtoKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDtoAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDtoStatemachineControlDTOAttributeCrossReference_3_0 = (CrossReference)cDtoAssignment_3.eContents().get(0);
+		private final RuleCall cDtoStatemachineControlDTOAttributeIDTerminalRuleCall_3_0_1 = (RuleCall)cDtoStatemachineControlDTOAttributeCrossReference_3_0.eContents().get(1);
+		private final Keyword cFullStopKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cAttributeAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final CrossReference cAttributeLDtoInheritedAttributeCrossReference_5_0 = (CrossReference)cAttributeAssignment_5.eContents().get(0);
+		private final RuleCall cAttributeLDtoInheritedAttributeIDTerminalRuleCall_5_0_1 = (RuleCall)cAttributeLDtoInheritedAttributeCrossReference_5_0.eContents().get(1);
+		
+		//StatemachineActionFieldSourceDtoAttributeMore returns StatemachineActionFieldSourceDtoAttribute:
+		//	{StatemachineActionFieldSourceDtoAttribute} "+" "dto" dto=[StatemachineControlDTOAttribute] "."
+		//	attribute=[dto::LDtoInheritedAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineActionFieldSourceDtoAttribute} "+" "dto" dto=[StatemachineControlDTOAttribute] "."
+		//attribute=[dto::LDtoInheritedAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineActionFieldSourceDtoAttribute}
+		public Action getStatemachineActionFieldSourceDtoAttributeAction_0() { return cStatemachineActionFieldSourceDtoAttributeAction_0; }
+
+		//"+"
+		public Keyword getPlusSignKeyword_1() { return cPlusSignKeyword_1; }
+
+		//"dto"
+		public Keyword getDtoKeyword_2() { return cDtoKeyword_2; }
+
+		//dto=[StatemachineControlDTOAttribute]
+		public Assignment getDtoAssignment_3() { return cDtoAssignment_3; }
+
+		//[StatemachineControlDTOAttribute]
+		public CrossReference getDtoStatemachineControlDTOAttributeCrossReference_3_0() { return cDtoStatemachineControlDTOAttributeCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDtoStatemachineControlDTOAttributeIDTerminalRuleCall_3_0_1() { return cDtoStatemachineControlDTOAttributeIDTerminalRuleCall_3_0_1; }
+
+		//"."
+		public Keyword getFullStopKeyword_4() { return cFullStopKeyword_4; }
+
+		//attribute=[dto::LDtoInheritedAttribute]
+		public Assignment getAttributeAssignment_5() { return cAttributeAssignment_5; }
+
+		//[dto::LDtoInheritedAttribute]
+		public CrossReference getAttributeLDtoInheritedAttributeCrossReference_5_0() { return cAttributeLDtoInheritedAttributeCrossReference_5_0; }
+
+		//ID
+		public RuleCall getAttributeLDtoInheritedAttributeIDTerminalRuleCall_5_0_1() { return cAttributeLDtoInheritedAttributeIDTerminalRuleCall_5_0_1; }
+	}
+
+	public class StatemachineActionFieldConcatenationElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldConcatenation");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cFirstAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cFirstStatemachineActionFieldSourceParserRuleCall_0_0 = (RuleCall)cFirstAssignment_0.eContents().get(0);
+		private final Assignment cMoreAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cMoreStatemachineActionFieldSourceMoreParserRuleCall_1_0 = (RuleCall)cMoreAssignment_1.eContents().get(0);
+		
+		//StatemachineActionFieldConcatenation:
+		//	first=StatemachineActionFieldSource more+=StatemachineActionFieldSourceMore*;
+		public ParserRule getRule() { return rule; }
+
+		//first=StatemachineActionFieldSource more+=StatemachineActionFieldSourceMore*
+		public Group getGroup() { return cGroup; }
+
+		//first=StatemachineActionFieldSource
+		public Assignment getFirstAssignment_0() { return cFirstAssignment_0; }
+
+		//StatemachineActionFieldSource
+		public RuleCall getFirstStatemachineActionFieldSourceParserRuleCall_0_0() { return cFirstStatemachineActionFieldSourceParserRuleCall_0_0; }
+
+		//more+=StatemachineActionFieldSourceMore*
+		public Assignment getMoreAssignment_1() { return cMoreAssignment_1; }
+
+		//StatemachineActionFieldSourceMore
+		public RuleCall getMoreStatemachineActionFieldSourceMoreParserRuleCall_1_0() { return cMoreStatemachineActionFieldSourceMoreParserRuleCall_1_0; }
+	}
+
+	public class StatemachineOperationParameterElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineOperationParameter");
+		private final Assignment cSourceAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cSourceStatemachineActionFieldConcatenationParserRuleCall_0 = (RuleCall)cSourceAssignment.eContents().get(0);
+		
+		//StatemachineOperationParameter:
+		//	source=StatemachineActionFieldConcatenation;
+		public ParserRule getRule() { return rule; }
+
+		//source=StatemachineActionFieldConcatenation
+		public Assignment getSourceAssignment() { return cSourceAssignment; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getSourceStatemachineActionFieldConcatenationParserRuleCall_0() { return cSourceStatemachineActionFieldConcatenationParserRuleCall_0; }
+	}
+
+	public class StatemachineOperationParameterMoreElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineOperationParameterMore");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineOperationParameterAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cCommaKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cSourceAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cSourceStatemachineActionFieldConcatenationParserRuleCall_2_0 = (RuleCall)cSourceAssignment_2.eContents().get(0);
+		
+		//StatemachineOperationParameterMore returns StatemachineOperationParameter:
+		//	{StatemachineOperationParameter} "," source=StatemachineActionFieldConcatenation;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineOperationParameter} "," source=StatemachineActionFieldConcatenation
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineOperationParameter}
+		public Action getStatemachineOperationParameterAction_0() { return cStatemachineOperationParameterAction_0; }
+
+		//","
+		public Keyword getCommaKeyword_1() { return cCommaKeyword_1; }
+
+		//source=StatemachineActionFieldConcatenation
+		public Assignment getSourceAssignment_2() { return cSourceAssignment_2; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getSourceStatemachineActionFieldConcatenationParserRuleCall_2_0() { return cSourceStatemachineActionFieldConcatenationParserRuleCall_2_0; }
+	}
+
+	public class StatemachineActionFieldSetElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldSet");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cSetKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cSourceAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cSourceStatemachineActionFieldConcatenationParserRuleCall_1_0 = (RuleCall)cSourceAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cAttributeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cAttributeStatemachineControlFieldAttributeCrossReference_3_0 = (CrossReference)cAttributeAssignment_3.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_3_0_1 = (RuleCall)cAttributeStatemachineControlFieldAttributeCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionFieldSet:
+		//	"set" source=StatemachineActionFieldConcatenation "@" attribute=[StatemachineControlFieldAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"set" source=StatemachineActionFieldConcatenation "@" attribute=[StatemachineControlFieldAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"set"
+		public Keyword getSetKeyword_0() { return cSetKeyword_0; }
+
+		//source=StatemachineActionFieldConcatenation
+		public Assignment getSourceAssignment_1() { return cSourceAssignment_1; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getSourceStatemachineActionFieldConcatenationParserRuleCall_1_0() { return cSourceStatemachineActionFieldConcatenationParserRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//attribute=[StatemachineControlFieldAttribute]
+		public Assignment getAttributeAssignment_3() { return cAttributeAssignment_3; }
+
+		//[StatemachineControlFieldAttribute]
+		public CrossReference getAttributeStatemachineControlFieldAttributeCrossReference_3_0() { return cAttributeStatemachineControlFieldAttributeCrossReference_3_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_3_0_1() { return cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionFieldClearElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldClear");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cClearKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cAttributeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cAttributeStatemachineControlFieldAttributeCrossReference_1_0 = (CrossReference)cAttributeAssignment_1.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cAttributeStatemachineControlFieldAttributeCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionFieldClear:
+		//	"clear" attribute=[StatemachineControlFieldAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"clear" attribute=[StatemachineControlFieldAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"clear"
+		public Keyword getClearKeyword_0() { return cClearKeyword_0; }
+
+		//attribute=[StatemachineControlFieldAttribute]
+		public Assignment getAttributeAssignment_1() { return cAttributeAssignment_1; }
+
+		//[StatemachineControlFieldAttribute]
+		public CrossReference getAttributeStatemachineControlFieldAttributeCrossReference_1_0() { return cAttributeStatemachineControlFieldAttributeCrossReference_1_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1() { return cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineActionFieldGetElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldGet");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cGetKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cAttributeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cAttributeStatemachineControlFieldAttributeCrossReference_1_0 = (CrossReference)cAttributeAssignment_1.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cAttributeStatemachineControlFieldAttributeCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionFieldGet:
+		//	"get" attribute=[StatemachineControlFieldAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"get" attribute=[StatemachineControlFieldAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"get"
+		public Keyword getGetKeyword_0() { return cGetKeyword_0; }
+
+		//attribute=[StatemachineControlFieldAttribute]
+		public Assignment getAttributeAssignment_1() { return cAttributeAssignment_1; }
+
+		//[StatemachineControlFieldAttribute]
+		public CrossReference getAttributeStatemachineControlFieldAttributeCrossReference_1_0() { return cAttributeStatemachineControlFieldAttributeCrossReference_1_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1() { return cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineActionFieldRemoveElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionFieldRemove");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cRemoveKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cAttributeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cAttributeStatemachineControlFieldAttributeCrossReference_1_0 = (CrossReference)cAttributeAssignment_1.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cAttributeStatemachineControlFieldAttributeCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionFieldRemove:
+		//	"remove" attribute=[StatemachineControlFieldAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"remove" attribute=[StatemachineControlFieldAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"remove"
+		public Keyword getRemoveKeyword_0() { return cRemoveKeyword_0; }
+
+		//attribute=[StatemachineControlFieldAttribute]
+		public Assignment getAttributeAssignment_1() { return cAttributeAssignment_1; }
+
+		//[StatemachineControlFieldAttribute]
+		public CrossReference getAttributeStatemachineControlFieldAttributeCrossReference_1_0() { return cAttributeStatemachineControlFieldAttributeCrossReference_1_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1() { return cAttributeStatemachineControlFieldAttributeIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineControlVisibilityElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlVisibility");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cStatemachineControlFieldAttributeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStatemachineControlFieldLayoutParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cStatemachineControlButtonAttributeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cStatemachineControlButtonParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		
+		//StatemachineControlVisibility:
+		//	StatemachineControlFieldAttribute | StatemachineControlFieldLayout | StatemachineControlButtonAttribute |
+		//	StatemachineControlButton;
+		public ParserRule getRule() { return rule; }
+
+		//StatemachineControlFieldAttribute | StatemachineControlFieldLayout | StatemachineControlButtonAttribute |
+		//StatemachineControlButton
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//StatemachineControlFieldAttribute
+		public RuleCall getStatemachineControlFieldAttributeParserRuleCall_0() { return cStatemachineControlFieldAttributeParserRuleCall_0; }
+
+		//StatemachineControlFieldLayout
+		public RuleCall getStatemachineControlFieldLayoutParserRuleCall_1() { return cStatemachineControlFieldLayoutParserRuleCall_1; }
+
+		//StatemachineControlButtonAttribute
+		public RuleCall getStatemachineControlButtonAttributeParserRuleCall_2() { return cStatemachineControlButtonAttributeParserRuleCall_2; }
+
+		//StatemachineControlButton
+		public RuleCall getStatemachineControlButtonParserRuleCall_3() { return cStatemachineControlButtonParserRuleCall_3; }
+	}
+
+	public class StatemachineActionItemVisibleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionItemVisible");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cVisibleKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cAttributeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cAttributeStatemachineControlVisibilityCrossReference_1_0 = (CrossReference)cAttributeAssignment_1.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlVisibilityIDTerminalRuleCall_1_0_1 = (RuleCall)cAttributeStatemachineControlVisibilityCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionItemVisible:
+		//	"visible" attribute=[StatemachineControlVisibility];
+		public ParserRule getRule() { return rule; }
+
+		//"visible" attribute=[StatemachineControlVisibility]
+		public Group getGroup() { return cGroup; }
+
+		//"visible"
+		public Keyword getVisibleKeyword_0() { return cVisibleKeyword_0; }
+
+		//attribute=[StatemachineControlVisibility]
+		public Assignment getAttributeAssignment_1() { return cAttributeAssignment_1; }
+
+		//[StatemachineControlVisibility]
+		public CrossReference getAttributeStatemachineControlVisibilityCrossReference_1_0() { return cAttributeStatemachineControlVisibilityCrossReference_1_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlVisibilityIDTerminalRuleCall_1_0_1() { return cAttributeStatemachineControlVisibilityIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineActionItemInvisibleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionItemInvisible");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cInvisibleKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cAttributeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cAttributeStatemachineControlVisibilityCrossReference_1_0 = (CrossReference)cAttributeAssignment_1.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlVisibilityIDTerminalRuleCall_1_0_1 = (RuleCall)cAttributeStatemachineControlVisibilityCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionItemInvisible:
+		//	"invisible" attribute=[StatemachineControlVisibility];
+		public ParserRule getRule() { return rule; }
+
+		//"invisible" attribute=[StatemachineControlVisibility]
+		public Group getGroup() { return cGroup; }
+
+		//"invisible"
+		public Keyword getInvisibleKeyword_0() { return cInvisibleKeyword_0; }
+
+		//attribute=[StatemachineControlVisibility]
+		public Assignment getAttributeAssignment_1() { return cAttributeAssignment_1; }
+
+		//[StatemachineControlVisibility]
+		public CrossReference getAttributeStatemachineControlVisibilityCrossReference_1_0() { return cAttributeStatemachineControlVisibilityCrossReference_1_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlVisibilityIDTerminalRuleCall_1_0_1() { return cAttributeStatemachineControlVisibilityIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineActionButtonCaptionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionButtonCaption");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cCaptionKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cCaptionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cCaptionStatemachineActionFieldConcatenationParserRuleCall_1_0 = (RuleCall)cCaptionAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cAttributeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cAttributeStatemachineControlButtonAttributeCrossReference_3_0 = (CrossReference)cAttributeAssignment_3.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlButtonAttributeIDTerminalRuleCall_3_0_1 = (RuleCall)cAttributeStatemachineControlButtonAttributeCrossReference_3_0.eContents().get(1);
+		
+		//// buttons
+		//StatemachineActionButtonCaption:
+		//	"caption" caption=StatemachineActionFieldConcatenation "@" attribute=[StatemachineControlButtonAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"caption" caption=StatemachineActionFieldConcatenation "@" attribute=[StatemachineControlButtonAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"caption"
+		public Keyword getCaptionKeyword_0() { return cCaptionKeyword_0; }
+
+		//caption=StatemachineActionFieldConcatenation
+		public Assignment getCaptionAssignment_1() { return cCaptionAssignment_1; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getCaptionStatemachineActionFieldConcatenationParserRuleCall_1_0() { return cCaptionStatemachineActionFieldConcatenationParserRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//attribute=[StatemachineControlButtonAttribute]
+		public Assignment getAttributeAssignment_3() { return cAttributeAssignment_3; }
+
+		//[StatemachineControlButtonAttribute]
+		public CrossReference getAttributeStatemachineControlButtonAttributeCrossReference_3_0() { return cAttributeStatemachineControlButtonAttributeCrossReference_3_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlButtonAttributeIDTerminalRuleCall_3_0_1() { return cAttributeStatemachineControlButtonAttributeIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionButtonImageElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionButtonImage");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cImageKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cImageAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cImageSTRINGTerminalRuleCall_1_0 = (RuleCall)cImageAssignment_1.eContents().get(0);
+		private final Keyword cCommercialAtKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cAttributeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cAttributeStatemachineControlButtonAttributeCrossReference_3_0 = (CrossReference)cAttributeAssignment_3.eContents().get(0);
+		private final RuleCall cAttributeStatemachineControlButtonAttributeIDTerminalRuleCall_3_0_1 = (RuleCall)cAttributeStatemachineControlButtonAttributeCrossReference_3_0.eContents().get(1);
+		
+		//StatemachineActionButtonImage:
+		//	"image" image=STRING "@" attribute=[StatemachineControlButtonAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"image" image=STRING "@" attribute=[StatemachineControlButtonAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"image"
+		public Keyword getImageKeyword_0() { return cImageKeyword_0; }
+
+		//image=STRING
+		public Assignment getImageAssignment_1() { return cImageAssignment_1; }
+
+		//STRING
+		public RuleCall getImageSTRINGTerminalRuleCall_1_0() { return cImageSTRINGTerminalRuleCall_1_0; }
+
+		//"@"
+		public Keyword getCommercialAtKeyword_2() { return cCommercialAtKeyword_2; }
+
+		//attribute=[StatemachineControlButtonAttribute]
+		public Assignment getAttributeAssignment_3() { return cAttributeAssignment_3; }
+
+		//[StatemachineControlButtonAttribute]
+		public CrossReference getAttributeStatemachineControlButtonAttributeCrossReference_3_0() { return cAttributeStatemachineControlButtonAttributeCrossReference_3_0; }
+
+		//ID
+		public RuleCall getAttributeStatemachineControlButtonAttributeIDTerminalRuleCall_3_0_1() { return cAttributeStatemachineControlButtonAttributeIDTerminalRuleCall_3_0_1; }
+	}
+
+	public class StatemachineActionDTOFindElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionDTOFind");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cSearchKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cSearchAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cSearchStatemachineActionFieldConcatenationParserRuleCall_1_0 = (RuleCall)cSearchAssignment_1.eContents().get(0);
+		private final Keyword cInKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDtoAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final CrossReference cDtoStatemachineControlDTOAttributeCrossReference_3_0 = (CrossReference)cDtoAssignment_3.eContents().get(0);
+		private final RuleCall cDtoStatemachineControlDTOAttributeIDTerminalRuleCall_3_0_1 = (RuleCall)cDtoStatemachineControlDTOAttributeCrossReference_3_0.eContents().get(1);
+		private final Keyword cFullStopKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cAttributeAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final CrossReference cAttributeLDtoInheritedAttributeCrossReference_5_0 = (CrossReference)cAttributeAssignment_5.eContents().get(0);
+		private final RuleCall cAttributeLDtoInheritedAttributeIDTerminalRuleCall_5_0_1 = (RuleCall)cAttributeLDtoInheritedAttributeCrossReference_5_0.eContents().get(1);
+		
+		//// dto
+		//StatemachineActionDTOFind:
+		//	"search" search=StatemachineActionFieldConcatenation "in" dto=[StatemachineControlDTOAttribute] "."
+		//	attribute=[dto::LDtoInheritedAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"search" search=StatemachineActionFieldConcatenation "in" dto=[StatemachineControlDTOAttribute] "."
+		//attribute=[dto::LDtoInheritedAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"search"
+		public Keyword getSearchKeyword_0() { return cSearchKeyword_0; }
+
+		//search=StatemachineActionFieldConcatenation
+		public Assignment getSearchAssignment_1() { return cSearchAssignment_1; }
+
+		//StatemachineActionFieldConcatenation
+		public RuleCall getSearchStatemachineActionFieldConcatenationParserRuleCall_1_0() { return cSearchStatemachineActionFieldConcatenationParserRuleCall_1_0; }
+
+		//"in"
+		public Keyword getInKeyword_2() { return cInKeyword_2; }
+
+		//dto=[StatemachineControlDTOAttribute]
+		public Assignment getDtoAssignment_3() { return cDtoAssignment_3; }
+
+		//[StatemachineControlDTOAttribute]
+		public CrossReference getDtoStatemachineControlDTOAttributeCrossReference_3_0() { return cDtoStatemachineControlDTOAttributeCrossReference_3_0; }
+
+		//ID
+		public RuleCall getDtoStatemachineControlDTOAttributeIDTerminalRuleCall_3_0_1() { return cDtoStatemachineControlDTOAttributeIDTerminalRuleCall_3_0_1; }
+
+		//"."
+		public Keyword getFullStopKeyword_4() { return cFullStopKeyword_4; }
+
+		//attribute=[dto::LDtoInheritedAttribute]
+		public Assignment getAttributeAssignment_5() { return cAttributeAssignment_5; }
+
+		//[dto::LDtoInheritedAttribute]
+		public CrossReference getAttributeLDtoInheritedAttributeCrossReference_5_0() { return cAttributeLDtoInheritedAttributeCrossReference_5_0; }
+
+		//ID
+		public RuleCall getAttributeLDtoInheritedAttributeIDTerminalRuleCall_5_0_1() { return cAttributeLDtoInheritedAttributeIDTerminalRuleCall_5_0_1; }
+	}
+
+	public class StatemachineActionSchedulerElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineActionScheduler");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cScheduleKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cSchedulerAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cSchedulerStatemachineControlSchedulerAttributeCrossReference_1_0 = (CrossReference)cSchedulerAssignment_1.eContents().get(0);
+		private final RuleCall cSchedulerStatemachineControlSchedulerAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cSchedulerStatemachineControlSchedulerAttributeCrossReference_1_0.eContents().get(1);
+		
+		//StatemachineActionScheduler:
+		//	"schedule" scheduler=[StatemachineControlSchedulerAttribute];
+		public ParserRule getRule() { return rule; }
+
+		//"schedule" scheduler=[StatemachineControlSchedulerAttribute]
+		public Group getGroup() { return cGroup; }
+
+		//"schedule"
+		public Keyword getScheduleKeyword_0() { return cScheduleKeyword_0; }
+
+		//scheduler=[StatemachineControlSchedulerAttribute]
+		public Assignment getSchedulerAssignment_1() { return cSchedulerAssignment_1; }
+
+		//[StatemachineControlSchedulerAttribute]
+		public CrossReference getSchedulerStatemachineControlSchedulerAttributeCrossReference_1_0() { return cSchedulerStatemachineControlSchedulerAttributeCrossReference_1_0; }
+
+		//ID
+		public RuleCall getSchedulerStatemachineControlSchedulerAttributeIDTerminalRuleCall_1_0_1() { return cSchedulerStatemachineControlSchedulerAttributeIDTerminalRuleCall_1_0_1; }
+	}
+
+	public class StatemachineControlElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControl");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cStatemachineControlButtonParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStatemachineControlFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cStatemachineControlDTOParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cStatemachineControlSchedulerParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cStatemachineControlPeripheralParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		
+		//StatemachineControl:
+		//	StatemachineControlButton | StatemachineControlField | StatemachineControlDTO | StatemachineControlScheduler |
+		//	StatemachineControlPeripheral;
+		public ParserRule getRule() { return rule; }
+
+		//StatemachineControlButton | StatemachineControlField | StatemachineControlDTO | StatemachineControlScheduler |
+		//StatemachineControlPeripheral
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//StatemachineControlButton
+		public RuleCall getStatemachineControlButtonParserRuleCall_0() { return cStatemachineControlButtonParserRuleCall_0; }
+
+		//StatemachineControlField
+		public RuleCall getStatemachineControlFieldParserRuleCall_1() { return cStatemachineControlFieldParserRuleCall_1; }
+
+		//StatemachineControlDTO
+		public RuleCall getStatemachineControlDTOParserRuleCall_2() { return cStatemachineControlDTOParserRuleCall_2; }
+
+		//StatemachineControlScheduler
+		public RuleCall getStatemachineControlSchedulerParserRuleCall_3() { return cStatemachineControlSchedulerParserRuleCall_3; }
+
+		//StatemachineControlPeripheral
+		public RuleCall getStatemachineControlPeripheralParserRuleCall_4() { return cStatemachineControlPeripheralParserRuleCall_4; }
+	}
+
+	public class StatemachineControlButtonElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlButton");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cKeypadKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cEventKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cEventTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cEventTypeStatemachineControlButtonEventTypeEnumRuleCall_3_0 = (RuleCall)cEventTypeAssignment_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cButtonsAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cButtonsStatemachineControlButtonAttributeParserRuleCall_5_0 = (RuleCall)cButtonsAssignment_5.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//StatemachineControlButton:
+		//	"keypad" name=ID "event" eventType=StatemachineControlButtonEventType "{"
+		//	buttons+=StatemachineControlButtonAttribute* "}";
+		public ParserRule getRule() { return rule; }
+
+		//"keypad" name=ID "event" eventType=StatemachineControlButtonEventType "{" buttons+=StatemachineControlButtonAttribute*
+		//"}"
+		public Group getGroup() { return cGroup; }
+
+		//"keypad"
+		public Keyword getKeypadKeyword_0() { return cKeypadKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//"event"
+		public Keyword getEventKeyword_2() { return cEventKeyword_2; }
+
+		//eventType=StatemachineControlButtonEventType
+		public Assignment getEventTypeAssignment_3() { return cEventTypeAssignment_3; }
+
+		//StatemachineControlButtonEventType
+		public RuleCall getEventTypeStatemachineControlButtonEventTypeEnumRuleCall_3_0() { return cEventTypeStatemachineControlButtonEventTypeEnumRuleCall_3_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
+
+		//buttons+=StatemachineControlButtonAttribute*
+		public Assignment getButtonsAssignment_5() { return cButtonsAssignment_5; }
+
+		//StatemachineControlButtonAttribute
+		public RuleCall getButtonsStatemachineControlButtonAttributeParserRuleCall_5_0() { return cButtonsStatemachineControlButtonAttributeParserRuleCall_5_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
+	}
+
+	public class StatemachineControlFieldElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlField");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cFieldsKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
+		private final Assignment cFieldsAssignment_3_0 = (Assignment)cUnorderedGroup_3.eContents().get(0);
+		private final RuleCall cFieldsStatemachineControlFieldAttributeParserRuleCall_3_0_0 = (RuleCall)cFieldsAssignment_3_0.eContents().get(0);
+		private final Assignment cLayoutsAssignment_3_1 = (Assignment)cUnorderedGroup_3.eContents().get(1);
+		private final RuleCall cLayoutsStatemachineControlFieldLayoutParserRuleCall_3_1_0 = (RuleCall)cLayoutsAssignment_3_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//StatemachineControlField:
+		//	"fields" name=ID "{" (fields+=StatemachineControlFieldAttribute* & layouts+=StatemachineControlFieldLayout*) "}";
+		public ParserRule getRule() { return rule; }
+
+		//"fields" name=ID "{" (fields+=StatemachineControlFieldAttribute* & layouts+=StatemachineControlFieldLayout*) "}"
+		public Group getGroup() { return cGroup; }
+
+		//"fields"
+		public Keyword getFieldsKeyword_0() { return cFieldsKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+
+		//fields+=StatemachineControlFieldAttribute* & layouts+=StatemachineControlFieldLayout*
+		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
+
+		//fields+=StatemachineControlFieldAttribute*
+		public Assignment getFieldsAssignment_3_0() { return cFieldsAssignment_3_0; }
+
+		//StatemachineControlFieldAttribute
+		public RuleCall getFieldsStatemachineControlFieldAttributeParserRuleCall_3_0_0() { return cFieldsStatemachineControlFieldAttributeParserRuleCall_3_0_0; }
+
+		//layouts+=StatemachineControlFieldLayout*
+		public Assignment getLayoutsAssignment_3_1() { return cLayoutsAssignment_3_1; }
+
+		//StatemachineControlFieldLayout
+		public RuleCall getLayoutsStatemachineControlFieldLayoutParserRuleCall_3_1_0() { return cLayoutsStatemachineControlFieldLayoutParserRuleCall_3_1_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+
+	public class StatemachineControlDTOElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlDTO");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDataProviderKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDtosAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cDtosStatemachineControlDTOAttributeParserRuleCall_3_0 = (RuleCall)cDtosAssignment_3.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//StatemachineControlDTO:
+		//	"dataProvider" name=ID "{" dtos+=StatemachineControlDTOAttribute* "}";
+		public ParserRule getRule() { return rule; }
+
+		//"dataProvider" name=ID "{" dtos+=StatemachineControlDTOAttribute* "}"
+		public Group getGroup() { return cGroup; }
+
+		//"dataProvider"
+		public Keyword getDataProviderKeyword_0() { return cDataProviderKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+
+		//dtos+=StatemachineControlDTOAttribute*
+		public Assignment getDtosAssignment_3() { return cDtosAssignment_3; }
+
+		//StatemachineControlDTOAttribute
+		public RuleCall getDtosStatemachineControlDTOAttributeParserRuleCall_3_0() { return cDtosStatemachineControlDTOAttributeParserRuleCall_3_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+
+	public class StatemachineControlSchedulerElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlScheduler");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cSchedulerKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cSchedulersAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cSchedulersStatemachineControlSchedulerAttributeParserRuleCall_3_0 = (RuleCall)cSchedulersAssignment_3.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//StatemachineControlScheduler:
+		//	"scheduler" name=ID "{" schedulers+=StatemachineControlSchedulerAttribute* "}";
+		public ParserRule getRule() { return rule; }
+
+		//"scheduler" name=ID "{" schedulers+=StatemachineControlSchedulerAttribute* "}"
+		public Group getGroup() { return cGroup; }
+
+		//"scheduler"
+		public Keyword getSchedulerKeyword_0() { return cSchedulerKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+
+		//schedulers+=StatemachineControlSchedulerAttribute*
+		public Assignment getSchedulersAssignment_3() { return cSchedulersAssignment_3; }
+
+		//StatemachineControlSchedulerAttribute
+		public RuleCall getSchedulersStatemachineControlSchedulerAttributeParserRuleCall_3_0() { return cSchedulersStatemachineControlSchedulerAttributeParserRuleCall_3_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+
+	public class StatemachinePeripheralDeviceLineDisplayElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachinePeripheralDeviceLineDisplay");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cLineDisplayKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		
+		//StatemachinePeripheralDeviceLineDisplay:
+		//	"lineDisplay" name=ID;
+		public ParserRule getRule() { return rule; }
+
+		//"lineDisplay" name=ID
+		public Group getGroup() { return cGroup; }
+
+		//"lineDisplay"
+		public Keyword getLineDisplayKeyword_0() { return cLineDisplayKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+	}
+
+	public class StatemachinePeripheralDevicePOSPrinterElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachinePeripheralDevicePOSPrinter");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPosPrinterKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		
+		//StatemachinePeripheralDevicePOSPrinter:
+		//	"posPrinter" name=ID;
+		public ParserRule getRule() { return rule; }
+
+		//"posPrinter" name=ID
+		public Group getGroup() { return cGroup; }
+
+		//"posPrinter"
+		public Keyword getPosPrinterKeyword_0() { return cPosPrinterKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+	}
+
+	public class StatemachinePeripheralDeviceCashDrawerElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachinePeripheralDeviceCashDrawer");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cCashDrawerKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		
+		//StatemachinePeripheralDeviceCashDrawer:
+		//	"cashDrawer" name=ID;
+		public ParserRule getRule() { return rule; }
+
+		//"cashDrawer" name=ID
+		public Group getGroup() { return cGroup; }
+
+		//"cashDrawer"
+		public Keyword getCashDrawerKeyword_0() { return cCashDrawerKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+	}
+
+	public class StatemachinePeripheralDevicePTElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachinePeripheralDevicePT");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPaymentKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		
+		//StatemachinePeripheralDevicePT:
+		//	"payment" name=ID;
+		public ParserRule getRule() { return rule; }
+
+		//"payment" name=ID
+		public Group getGroup() { return cGroup; }
+
+		//"payment"
+		public Keyword getPaymentKeyword_0() { return cPaymentKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+	}
+
+	public class StatemachineControlPeripheralElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlPeripheral");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cPeripheralKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cLineDisplaysAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cLineDisplaysStatemachinePeripheralDeviceLineDisplayParserRuleCall_3_0 = (RuleCall)cLineDisplaysAssignment_3.eContents().get(0);
+		private final Assignment cPosPrintersAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cPosPrintersStatemachinePeripheralDevicePOSPrinterParserRuleCall_4_0 = (RuleCall)cPosPrintersAssignment_4.eContents().get(0);
+		private final Assignment cCashDrawersAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cCashDrawersStatemachinePeripheralDeviceCashDrawerParserRuleCall_5_0 = (RuleCall)cCashDrawersAssignment_5.eContents().get(0);
+		private final Assignment cPaymentTerminalsAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cPaymentTerminalsStatemachinePeripheralDevicePTParserRuleCall_6_0 = (RuleCall)cPaymentTerminalsAssignment_6.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
+		
+		//StatemachineControlPeripheral:
+		//	"peripheral" name=ID "{" lineDisplays+=StatemachinePeripheralDeviceLineDisplay*
+		//	posPrinters+=StatemachinePeripheralDevicePOSPrinter* cashDrawers+=StatemachinePeripheralDeviceCashDrawer*
+		//	paymentTerminals+=StatemachinePeripheralDevicePT* "}";
+		public ParserRule getRule() { return rule; }
+
+		//"peripheral" name=ID "{" lineDisplays+=StatemachinePeripheralDeviceLineDisplay*
+		//posPrinters+=StatemachinePeripheralDevicePOSPrinter* cashDrawers+=StatemachinePeripheralDeviceCashDrawer*
+		//paymentTerminals+=StatemachinePeripheralDevicePT* "}"
+		public Group getGroup() { return cGroup; }
+
+		//"peripheral"
+		public Keyword getPeripheralKeyword_0() { return cPeripheralKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//"{"
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+
+		//lineDisplays+=StatemachinePeripheralDeviceLineDisplay*
+		public Assignment getLineDisplaysAssignment_3() { return cLineDisplaysAssignment_3; }
+
+		//StatemachinePeripheralDeviceLineDisplay
+		public RuleCall getLineDisplaysStatemachinePeripheralDeviceLineDisplayParserRuleCall_3_0() { return cLineDisplaysStatemachinePeripheralDeviceLineDisplayParserRuleCall_3_0; }
+
+		//posPrinters+=StatemachinePeripheralDevicePOSPrinter*
+		public Assignment getPosPrintersAssignment_4() { return cPosPrintersAssignment_4; }
+
+		//StatemachinePeripheralDevicePOSPrinter
+		public RuleCall getPosPrintersStatemachinePeripheralDevicePOSPrinterParserRuleCall_4_0() { return cPosPrintersStatemachinePeripheralDevicePOSPrinterParserRuleCall_4_0; }
+
+		//cashDrawers+=StatemachinePeripheralDeviceCashDrawer*
+		public Assignment getCashDrawersAssignment_5() { return cCashDrawersAssignment_5; }
+
+		//StatemachinePeripheralDeviceCashDrawer
+		public RuleCall getCashDrawersStatemachinePeripheralDeviceCashDrawerParserRuleCall_5_0() { return cCashDrawersStatemachinePeripheralDeviceCashDrawerParserRuleCall_5_0; }
+
+		//paymentTerminals+=StatemachinePeripheralDevicePT*
+		public Assignment getPaymentTerminalsAssignment_6() { return cPaymentTerminalsAssignment_6; }
+
+		//StatemachinePeripheralDevicePT
+		public RuleCall getPaymentTerminalsStatemachinePeripheralDevicePTParserRuleCall_6_0() { return cPaymentTerminalsStatemachinePeripheralDevicePTParserRuleCall_6_0; }
+
+		//"}"
+		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
+	}
+
+	public class StatemachineControlButtonAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlButtonAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cButtonKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Assignment cHasImageAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final Keyword cHasImageImageKeyword_2_0_0 = (Keyword)cHasImageAssignment_2_0.eContents().get(0);
+		private final Assignment cImageAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cImageSTRINGTerminalRuleCall_2_1_0 = (RuleCall)cImageAssignment_2_1.eContents().get(0);
+		private final Assignment cEventAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cEventStatemachineControlButtonAttributeEventParserRuleCall_3_0 = (RuleCall)cEventAssignment_3.eContents().get(0);
+		
+		//StatemachineControlButtonAttribute:
+		//	"button" name=TRANSLATABLEID (hasImage?="image" image=STRING)? event=StatemachineControlButtonAttributeEvent;
+		public ParserRule getRule() { return rule; }
+
+		//"button" name=TRANSLATABLEID (hasImage?="image" image=STRING)? event=StatemachineControlButtonAttributeEvent
+		public Group getGroup() { return cGroup; }
+
+		//"button"
+		public Keyword getButtonKeyword_0() { return cButtonKeyword_0; }
+
+		//name=TRANSLATABLEID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//TRANSLATABLEID
+		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
+
+		//(hasImage?="image" image=STRING)?
+		public Group getGroup_2() { return cGroup_2; }
+
+		//hasImage?="image"
+		public Assignment getHasImageAssignment_2_0() { return cHasImageAssignment_2_0; }
+
+		//"image"
+		public Keyword getHasImageImageKeyword_2_0_0() { return cHasImageImageKeyword_2_0_0; }
+
+		//image=STRING
+		public Assignment getImageAssignment_2_1() { return cImageAssignment_2_1; }
+
+		//STRING
+		public RuleCall getImageSTRINGTerminalRuleCall_2_1_0() { return cImageSTRINGTerminalRuleCall_2_1_0; }
+
+		//event=StatemachineControlButtonAttributeEvent
+		public Assignment getEventAssignment_3() { return cEventAssignment_3; }
+
+		//StatemachineControlButtonAttributeEvent
+		public RuleCall getEventStatemachineControlButtonAttributeEventParserRuleCall_3_0() { return cEventStatemachineControlButtonAttributeEventParserRuleCall_3_0; }
+	}
+
+	public class StatemachineControlButtonAttributeEventElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlButtonAttributeEvent");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cStatemachineControlButtonAttributeEventKeyboardParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStatemachineControlButtonAttributeEventIdentityParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cStatemachineControlButtonAttributeEventEventParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		
+		//StatemachineControlButtonAttributeEvent:
+		//	StatemachineControlButtonAttributeEventKeyboard | StatemachineControlButtonAttributeEventIdentity |
+		//	StatemachineControlButtonAttributeEventEvent;
+		public ParserRule getRule() { return rule; }
+
+		//StatemachineControlButtonAttributeEventKeyboard | StatemachineControlButtonAttributeEventIdentity |
+		//StatemachineControlButtonAttributeEventEvent
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//StatemachineControlButtonAttributeEventKeyboard
+		public RuleCall getStatemachineControlButtonAttributeEventKeyboardParserRuleCall_0() { return cStatemachineControlButtonAttributeEventKeyboardParserRuleCall_0; }
+
+		//StatemachineControlButtonAttributeEventIdentity
+		public RuleCall getStatemachineControlButtonAttributeEventIdentityParserRuleCall_1() { return cStatemachineControlButtonAttributeEventIdentityParserRuleCall_1; }
+
+		//StatemachineControlButtonAttributeEventEvent
+		public RuleCall getStatemachineControlButtonAttributeEventEventParserRuleCall_2() { return cStatemachineControlButtonAttributeEventEventParserRuleCall_2; }
+	}
+
+	public class StatemachineControlButtonAttributeEventKeyboardElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlButtonAttributeEventKeyboard");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineControlButtonAttributeEventKeyboardAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cKeyKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cKeystrokeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cKeystrokeSTRINGTerminalRuleCall_2_0 = (RuleCall)cKeystrokeAssignment_2.eContents().get(0);
+		
+		//StatemachineControlButtonAttributeEventKeyboard:
+		//	{StatemachineControlButtonAttributeEventKeyboard} "key" keystroke=STRING;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineControlButtonAttributeEventKeyboard} "key" keystroke=STRING
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineControlButtonAttributeEventKeyboard}
+		public Action getStatemachineControlButtonAttributeEventKeyboardAction_0() { return cStatemachineControlButtonAttributeEventKeyboardAction_0; }
+
+		//"key"
+		public Keyword getKeyKeyword_1() { return cKeyKeyword_1; }
+
+		//keystroke=STRING
+		public Assignment getKeystrokeAssignment_2() { return cKeystrokeAssignment_2; }
+
+		//STRING
+		public RuleCall getKeystrokeSTRINGTerminalRuleCall_2_0() { return cKeystrokeSTRINGTerminalRuleCall_2_0; }
+	}
+
+	public class StatemachineControlButtonAttributeEventIdentityElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlButtonAttributeEventIdentity");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineControlButtonAttributeEventIdentityAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cIdKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cIdentityAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cIdentityINTTerminalRuleCall_2_0 = (RuleCall)cIdentityAssignment_2.eContents().get(0);
+		
+		//StatemachineControlButtonAttributeEventIdentity:
+		//	{StatemachineControlButtonAttributeEventIdentity} "id" identity=INT;
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineControlButtonAttributeEventIdentity} "id" identity=INT
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineControlButtonAttributeEventIdentity}
+		public Action getStatemachineControlButtonAttributeEventIdentityAction_0() { return cStatemachineControlButtonAttributeEventIdentityAction_0; }
+
+		//"id"
+		public Keyword getIdKeyword_1() { return cIdKeyword_1; }
+
+		//identity=INT
+		public Assignment getIdentityAssignment_2() { return cIdentityAssignment_2; }
+
+		//INT
+		public RuleCall getIdentityINTTerminalRuleCall_2_0() { return cIdentityINTTerminalRuleCall_2_0; }
+	}
+
+	public class StatemachineControlButtonAttributeEventEventElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlButtonAttributeEventEvent");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineControlButtonAttributeEventEventAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cEventKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cEventAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cEventStatemachineEventCrossReference_2_0 = (CrossReference)cEventAssignment_2.eContents().get(0);
+		private final RuleCall cEventStatemachineEventIDTerminalRuleCall_2_0_1 = (RuleCall)cEventStatemachineEventCrossReference_2_0.eContents().get(1);
+		
+		//StatemachineControlButtonAttributeEventEvent:
+		//	{StatemachineControlButtonAttributeEventEvent} "event" event=[StatemachineEvent];
+		public ParserRule getRule() { return rule; }
+
+		//{StatemachineControlButtonAttributeEventEvent} "event" event=[StatemachineEvent]
+		public Group getGroup() { return cGroup; }
+
+		//{StatemachineControlButtonAttributeEventEvent}
+		public Action getStatemachineControlButtonAttributeEventEventAction_0() { return cStatemachineControlButtonAttributeEventEventAction_0; }
+
+		//"event"
+		public Keyword getEventKeyword_1() { return cEventKeyword_1; }
+
+		//event=[StatemachineEvent]
+		public Assignment getEventAssignment_2() { return cEventAssignment_2; }
+
+		//[StatemachineEvent]
+		public CrossReference getEventStatemachineEventCrossReference_2_0() { return cEventStatemachineEventCrossReference_2_0; }
+
+		//ID
+		public RuleCall getEventStatemachineEventIDTerminalRuleCall_2_0_1() { return cEventStatemachineEventIDTerminalRuleCall_2_0_1; }
+	}
+
+	public class StatemachineControlFieldAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlFieldAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cFieldKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cAttributeTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cAttributeTypeStatemachineFieldTypeParserRuleCall_3_0 = (RuleCall)cAttributeTypeAssignment_3.eContents().get(0);
+		
+		//StatemachineControlFieldAttribute:
+		//	"field" name=TRANSLATABLEID "type" attributeType=StatemachineFieldType;
+		public ParserRule getRule() { return rule; }
+
+		//"field" name=TRANSLATABLEID "type" attributeType=StatemachineFieldType
+		public Group getGroup() { return cGroup; }
+
+		//"field"
+		public Keyword getFieldKeyword_0() { return cFieldKeyword_0; }
+
+		//name=TRANSLATABLEID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//TRANSLATABLEID
+		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
+
+		//"type"
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+
+		//attributeType=StatemachineFieldType
+		public Assignment getAttributeTypeAssignment_3() { return cAttributeTypeAssignment_3; }
+
+		//StatemachineFieldType
+		public RuleCall getAttributeTypeStatemachineFieldTypeParserRuleCall_3_0() { return cAttributeTypeStatemachineFieldTypeParserRuleCall_3_0; }
+	}
+
+	public class StatemachineControlFieldLayoutElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlFieldLayout");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cLayoutKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		
+		//StatemachineControlFieldLayout:
+		//	"layout" name=ID;
+		public ParserRule getRule() { return rule; }
+
+		//"layout" name=ID
+		public Group getGroup() { return cGroup; }
+
+		//"layout"
+		public Keyword getLayoutKeyword_0() { return cLayoutKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+	}
+
+	public class StatemachineControlDTOAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlDTOAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDtoKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cAttributeTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cAttributeTypeStatemachineDTOTypeParserRuleCall_3_0 = (RuleCall)cAttributeTypeAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Assignment cHasEventAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
+		private final Keyword cHasEventEventKeyword_4_0_0 = (Keyword)cHasEventAssignment_4_0.eContents().get(0);
+		private final Assignment cEventAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final CrossReference cEventStatemachineEventCrossReference_4_1_0 = (CrossReference)cEventAssignment_4_1.eContents().get(0);
+		private final RuleCall cEventStatemachineEventIDTerminalRuleCall_4_1_0_1 = (RuleCall)cEventStatemachineEventCrossReference_4_1_0.eContents().get(1);
+		
+		//StatemachineControlDTOAttribute:
+		//	"dto" name=ID "type" attributeType=StatemachineDTOType (hasEvent?="event" event=[StatemachineEvent])?;
+		public ParserRule getRule() { return rule; }
+
+		//"dto" name=ID "type" attributeType=StatemachineDTOType (hasEvent?="event" event=[StatemachineEvent])?
+		public Group getGroup() { return cGroup; }
+
+		//"dto"
+		public Keyword getDtoKeyword_0() { return cDtoKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//"type"
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+
+		//attributeType=StatemachineDTOType
+		public Assignment getAttributeTypeAssignment_3() { return cAttributeTypeAssignment_3; }
+
+		//StatemachineDTOType
+		public RuleCall getAttributeTypeStatemachineDTOTypeParserRuleCall_3_0() { return cAttributeTypeStatemachineDTOTypeParserRuleCall_3_0; }
+
+		//(hasEvent?="event" event=[StatemachineEvent])?
+		public Group getGroup_4() { return cGroup_4; }
+
+		//hasEvent?="event"
+		public Assignment getHasEventAssignment_4_0() { return cHasEventAssignment_4_0; }
+
+		//"event"
+		public Keyword getHasEventEventKeyword_4_0_0() { return cHasEventEventKeyword_4_0_0; }
+
+		//event=[StatemachineEvent]
+		public Assignment getEventAssignment_4_1() { return cEventAssignment_4_1; }
+
+		//[StatemachineEvent]
+		public CrossReference getEventStatemachineEventCrossReference_4_1_0() { return cEventStatemachineEventCrossReference_4_1_0; }
+
+		//ID
+		public RuleCall getEventStatemachineEventIDTerminalRuleCall_4_1_0_1() { return cEventStatemachineEventIDTerminalRuleCall_4_1_0_1; }
+	}
+
+	public class StatemachineControlSchedulerAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlSchedulerAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cSchedulerKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cDelayKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDelayAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cDelayINTTerminalRuleCall_3_0 = (RuleCall)cDelayAssignment_3.eContents().get(0);
+		private final Keyword cSendKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cEventAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final CrossReference cEventStatemachineEventCrossReference_5_0 = (CrossReference)cEventAssignment_5.eContents().get(0);
+		private final RuleCall cEventStatemachineEventIDTerminalRuleCall_5_0_1 = (RuleCall)cEventStatemachineEventCrossReference_5_0.eContents().get(1);
+		
+		//StatemachineControlSchedulerAttribute:
+		//	"scheduler" name=ID "delay" delay=INT "send" event=[StatemachineEvent];
+		public ParserRule getRule() { return rule; }
+
+		//"scheduler" name=ID "delay" delay=INT "send" event=[StatemachineEvent]
+		public Group getGroup() { return cGroup; }
+
+		//"scheduler"
+		public Keyword getSchedulerKeyword_0() { return cSchedulerKeyword_0; }
+
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+		//"delay"
+		public Keyword getDelayKeyword_2() { return cDelayKeyword_2; }
+
+		//delay=INT
+		public Assignment getDelayAssignment_3() { return cDelayAssignment_3; }
+
+		//INT
+		public RuleCall getDelayINTTerminalRuleCall_3_0() { return cDelayINTTerminalRuleCall_3_0; }
+
+		//"send"
+		public Keyword getSendKeyword_4() { return cSendKeyword_4; }
+
+		//event=[StatemachineEvent]
+		public Assignment getEventAssignment_5() { return cEventAssignment_5; }
+
+		//[StatemachineEvent]
+		public CrossReference getEventStatemachineEventCrossReference_5_0() { return cEventStatemachineEventCrossReference_5_0; }
+
+		//ID
+		public RuleCall getEventStatemachineEventIDTerminalRuleCall_5_0_1() { return cEventStatemachineEventIDTerminalRuleCall_5_0_1; }
+	}
+
+	public class StatemachineDTOTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineDTOType");
+		private final Assignment cAttributeTypeAssignment = (Assignment)rule.eContents().get(1);
+		private final CrossReference cAttributeTypeLDtoCrossReference_0 = (CrossReference)cAttributeTypeAssignment.eContents().get(0);
+		private final RuleCall cAttributeTypeLDtoIDTerminalRuleCall_0_1 = (RuleCall)cAttributeTypeLDtoCrossReference_0.eContents().get(1);
+		
+		//StatemachineDTOType:
+		//	attributeType=[dto::LDto];
+		public ParserRule getRule() { return rule; }
+
+		//attributeType=[dto::LDto]
+		public Assignment getAttributeTypeAssignment() { return cAttributeTypeAssignment; }
+
+		//[dto::LDto]
+		public CrossReference getAttributeTypeLDtoCrossReference_0() { return cAttributeTypeLDtoCrossReference_0; }
+
+		//ID
+		public RuleCall getAttributeTypeLDtoIDTerminalRuleCall_0_1() { return cAttributeTypeLDtoIDTerminalRuleCall_0_1; }
+	}
+
+	public class StatemachineFieldTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineFieldType");
+		private final Assignment cAttributeTypeAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cAttributeTypeStatemachineInternalTypeEnumRuleCall_0 = (RuleCall)cAttributeTypeAssignment.eContents().get(0);
+		
+		//StatemachineFieldType:
+		//	attributeType=StatemachineInternalType;
+		public ParserRule getRule() { return rule; }
+
+		//attributeType=StatemachineInternalType
+		public Assignment getAttributeTypeAssignment() { return cAttributeTypeAssignment; }
+
+		//StatemachineInternalType
+		public RuleCall getAttributeTypeStatemachineInternalTypeEnumRuleCall_0() { return cAttributeTypeStatemachineInternalTypeEnumRuleCall_0; }
+	}
+
+	public class StatemachineImportElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineImport");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cImportKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cImportedNamespaceAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cImportedNamespaceStatemachineQualifiedNameWithWildCardParserRuleCall_1_0 = (RuleCall)cImportedNamespaceAssignment_1.eContents().get(0);
+		
+		//StatemachineImport returns types::LImport:
+		//	"import" importedNamespace=StatemachineQualifiedNameWithWildCard;
+		public ParserRule getRule() { return rule; }
+
+		//"import" importedNamespace=StatemachineQualifiedNameWithWildCard
+		public Group getGroup() { return cGroup; }
+
+		//"import"
+		public Keyword getImportKeyword_0() { return cImportKeyword_0; }
+
+		//importedNamespace=StatemachineQualifiedNameWithWildCard
+		public Assignment getImportedNamespaceAssignment_1() { return cImportedNamespaceAssignment_1; }
+
+		//StatemachineQualifiedNameWithWildCard
+		public RuleCall getImportedNamespaceStatemachineQualifiedNameWithWildCardParserRuleCall_1_0() { return cImportedNamespaceStatemachineQualifiedNameWithWildCardParserRuleCall_1_0; }
+	}
+
+	public class StatemachineQualifiedNameWithWildCardElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineQualifiedNameWithWildCard");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cQualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Keyword cAsteriskKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
+		
+		//StatemachineQualifiedNameWithWildCard:
+		//	QualifiedName ("." "*")?;
+		public ParserRule getRule() { return rule; }
+
+		//QualifiedName ("." "*")?
+		public Group getGroup() { return cGroup; }
+
+		//QualifiedName
+		public RuleCall getQualifiedNameParserRuleCall_0() { return cQualifiedNameParserRuleCall_0; }
+
+		//("." "*")?
+		public Group getGroup_1() { return cGroup_1; }
+
+		//"."
+		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
+
+		//"*"
+		public Keyword getAsteriskKeyword_1_1() { return cAsteriskKeyword_1_1; }
+	}
+
+	public 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 TRANSLATABLESTRINGElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "TRANSLATABLESTRING");
+		private final RuleCall cSTRINGTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//TRANSLATABLESTRING:
+		//	STRING;
+		public ParserRule getRule() { return rule; }
+
+		//STRING
+		public RuleCall getSTRINGTerminalRuleCall() { return cSTRINGTerminalRuleCall; }
+	}
+
+	public class TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "TRANSLATABLEID");
+		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//TRANSLATABLEID:
+		//	ID;
+		public ParserRule getRule() { return rule; }
+
+		//ID
+		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
+	}
+
+	public class SignedNumberElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "SignedNumber");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final RuleCall cUnsignedNumberParserRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		
+		//SignedNumber returns ecore::EDouble:
+		//	"-"? UnsignedNumber;
+		public ParserRule getRule() { return rule; }
+
+		//"-"? UnsignedNumber
+		public Group getGroup() { return cGroup; }
+
+		//"-"?
+		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
+
+		//UnsignedNumber
+		public RuleCall getUnsignedNumberParserRuleCall_1() { return cUnsignedNumberParserRuleCall_1; }
+	}
+
+	public class UnsignedNumberElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UnsignedNumber");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cINTTerminalRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final RuleCall cINTTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
+		
+		//UnsignedNumber returns ecore::EDouble:
+		//	INT ("." INT)?;
+		public ParserRule getRule() { return rule; }
+
+		//INT ("." INT)?
+		public Group getGroup() { return cGroup; }
+
+		//INT
+		public RuleCall getINTTerminalRuleCall_0() { return cINTTerminalRuleCall_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 StatemachineInternalTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineInternalType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cBOOLEANEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cBOOLEANBooleanKeyword_0_0 = (Keyword)cBOOLEANEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cINTEGEREnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cINTEGERIntegerKeyword_1_0 = (Keyword)cINTEGEREnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cLONGEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cLONGLongKeyword_2_0 = (Keyword)cLONGEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cDOUBLEEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cDOUBLEDoubleKeyword_3_0 = (Keyword)cDOUBLEEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cSTRINGEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cSTRINGStringKeyword_4_0 = (Keyword)cSTRINGEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cDATEEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cDATEDateKeyword_5_0 = (Keyword)cDATEEnumLiteralDeclaration_5.eContents().get(0);
+		private final EnumLiteralDeclaration cSUGGESTTEXTEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
+		private final Keyword cSUGGESTTEXTSuggestTextKeyword_6_0 = (Keyword)cSUGGESTTEXTEnumLiteralDeclaration_6.eContents().get(0);
+		
+		//enum StatemachineInternalType:
+		//	BOOLEAN="Boolean" | INTEGER="Integer" | LONG="Long" | DOUBLE="Double" | STRING="String" | DATE="Date" |
+		//	SUGGESTTEXT="SuggestText";
+		public EnumRule getRule() { return rule; }
+
+		//BOOLEAN="Boolean" | INTEGER="Integer" | LONG="Long" | DOUBLE="Double" | STRING="String" | DATE="Date" |
+		//SUGGESTTEXT="SuggestText"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//BOOLEAN="Boolean"
+		public EnumLiteralDeclaration getBOOLEANEnumLiteralDeclaration_0() { return cBOOLEANEnumLiteralDeclaration_0; }
+
+		//"Boolean"
+		public Keyword getBOOLEANBooleanKeyword_0_0() { return cBOOLEANBooleanKeyword_0_0; }
+
+		//INTEGER="Integer"
+		public EnumLiteralDeclaration getINTEGEREnumLiteralDeclaration_1() { return cINTEGEREnumLiteralDeclaration_1; }
+
+		//"Integer"
+		public Keyword getINTEGERIntegerKeyword_1_0() { return cINTEGERIntegerKeyword_1_0; }
+
+		//LONG="Long"
+		public EnumLiteralDeclaration getLONGEnumLiteralDeclaration_2() { return cLONGEnumLiteralDeclaration_2; }
+
+		//"Long"
+		public Keyword getLONGLongKeyword_2_0() { return cLONGLongKeyword_2_0; }
+
+		//DOUBLE="Double"
+		public EnumLiteralDeclaration getDOUBLEEnumLiteralDeclaration_3() { return cDOUBLEEnumLiteralDeclaration_3; }
+
+		//"Double"
+		public Keyword getDOUBLEDoubleKeyword_3_0() { return cDOUBLEDoubleKeyword_3_0; }
+
+		//STRING="String"
+		public EnumLiteralDeclaration getSTRINGEnumLiteralDeclaration_4() { return cSTRINGEnumLiteralDeclaration_4; }
+
+		//"String"
+		public Keyword getSTRINGStringKeyword_4_0() { return cSTRINGStringKeyword_4_0; }
+
+		//DATE="Date"
+		public EnumLiteralDeclaration getDATEEnumLiteralDeclaration_5() { return cDATEEnumLiteralDeclaration_5; }
+
+		//"Date"
+		public Keyword getDATEDateKeyword_5_0() { return cDATEDateKeyword_5_0; }
+
+		//SUGGESTTEXT="SuggestText"
+		public EnumLiteralDeclaration getSUGGESTTEXTEnumLiteralDeclaration_6() { return cSUGGESTTEXTEnumLiteralDeclaration_6; }
+
+		//"SuggestText"
+		public Keyword getSUGGESTTEXTSuggestTextKeyword_6_0() { return cSUGGESTTEXTSuggestTextKeyword_6_0; }
+	}
+
+	public class StatemachineControlButtonEventTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineControlButtonEventType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cKEYBOARDEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cKEYBOARDKeyboardKeyword_0_0 = (Keyword)cKEYBOARDEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cTRIGGEREnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cTRIGGERTriggerKeyword_1_0 = (Keyword)cTRIGGEREnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cIDENTITYEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cIDENTITYIdentityKeyword_2_0 = (Keyword)cIDENTITYEnumLiteralDeclaration_2.eContents().get(0);
+		
+		//enum StatemachineControlButtonEventType:
+		//	KEYBOARD="keyboard" | TRIGGER="trigger" | IDENTITY="identity";
+		public EnumRule getRule() { return rule; }
+
+		//KEYBOARD="keyboard" | TRIGGER="trigger" | IDENTITY="identity"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//KEYBOARD="keyboard"
+		public EnumLiteralDeclaration getKEYBOARDEnumLiteralDeclaration_0() { return cKEYBOARDEnumLiteralDeclaration_0; }
+
+		//"keyboard"
+		public Keyword getKEYBOARDKeyboardKeyword_0_0() { return cKEYBOARDKeyboardKeyword_0_0; }
+
+		//TRIGGER="trigger"
+		public EnumLiteralDeclaration getTRIGGEREnumLiteralDeclaration_1() { return cTRIGGEREnumLiteralDeclaration_1; }
+
+		//"trigger"
+		public Keyword getTRIGGERTriggerKeyword_1_0() { return cTRIGGERTriggerKeyword_1_0; }
+
+		//IDENTITY="identity"
+		public EnumLiteralDeclaration getIDENTITYEnumLiteralDeclaration_2() { return cIDENTITYEnumLiteralDeclaration_2; }
+
+		//"identity"
+		public Keyword getIDENTITYIdentityKeyword_2_0() { return cIDENTITYIdentityKeyword_2_0; }
+	}
+
+	public class StatemachineEvaluationTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineEvaluationType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cIP_ADDRESSEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cIP_ADDRESSGetIPAddressKeyword_0_0 = (Keyword)cIP_ADDRESSEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cNOWEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cNOWGetNowKeyword_1_0 = (Keyword)cNOWEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cUSER_AGENT_INFOEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cUSER_AGENT_INFOGetUserAgentInfoKeyword_2_0 = (Keyword)cUSER_AGENT_INFOEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cIS_TOUCH_DEVICEEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cIS_TOUCH_DEVICEIsTouchDeviceKeyword_3_0 = (Keyword)cIS_TOUCH_DEVICEEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cIS_HTTPSEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cIS_HTTPSIsHttpsKeyword_4_0 = (Keyword)cIS_HTTPSEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cBROWSER_LOCALEEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cBROWSER_LOCALEGetBrowserLocaleKeyword_5_0 = (Keyword)cBROWSER_LOCALEEnumLiteralDeclaration_5.eContents().get(0);
+		private final EnumLiteralDeclaration cUSER_NAMEEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
+		private final Keyword cUSER_NAMEGetUserNameKeyword_6_0 = (Keyword)cUSER_NAMEEnumLiteralDeclaration_6.eContents().get(0);
+		private final EnumLiteralDeclaration cUSER_PASSWORDEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
+		private final Keyword cUSER_PASSWORDGetUserPasswordKeyword_7_0 = (Keyword)cUSER_PASSWORDEnumLiteralDeclaration_7.eContents().get(0);
+		private final EnumLiteralDeclaration cUSER_EMAILEnumLiteralDeclaration_8 = (EnumLiteralDeclaration)cAlternatives.eContents().get(8);
+		private final Keyword cUSER_EMAILGetUserEmailKeyword_8_0 = (Keyword)cUSER_EMAILEnumLiteralDeclaration_8.eContents().get(0);
+		private final EnumLiteralDeclaration cUSER_POSITIONEnumLiteralDeclaration_9 = (EnumLiteralDeclaration)cAlternatives.eContents().get(9);
+		private final Keyword cUSER_POSITIONGetUserPositionKeyword_9_0 = (Keyword)cUSER_POSITIONEnumLiteralDeclaration_9.eContents().get(0);
+		private final EnumLiteralDeclaration cUSER_PRTSERVICEEnumLiteralDeclaration_10 = (EnumLiteralDeclaration)cAlternatives.eContents().get(10);
+		private final Keyword cUSER_PRTSERVICEGetUserPrintServiceKeyword_10_0 = (Keyword)cUSER_PRTSERVICEEnumLiteralDeclaration_10.eContents().get(0);
+		private final EnumLiteralDeclaration cSCREEN_WIDTHEnumLiteralDeclaration_11 = (EnumLiteralDeclaration)cAlternatives.eContents().get(11);
+		private final Keyword cSCREEN_WIDTHGetSceenWidthKeyword_11_0 = (Keyword)cSCREEN_WIDTHEnumLiteralDeclaration_11.eContents().get(0);
+		private final EnumLiteralDeclaration cSCREEN_HEIGHTEnumLiteralDeclaration_12 = (EnumLiteralDeclaration)cAlternatives.eContents().get(12);
+		private final Keyword cSCREEN_HEIGHTGetScreenHeightKeyword_12_0 = (Keyword)cSCREEN_HEIGHTEnumLiteralDeclaration_12.eContents().get(0);
+		private final EnumLiteralDeclaration cTRIGGEREnumLiteralDeclaration_13 = (EnumLiteralDeclaration)cAlternatives.eContents().get(13);
+		private final Keyword cTRIGGERGetTriggerKeyword_13_0 = (Keyword)cTRIGGEREnumLiteralDeclaration_13.eContents().get(0);
+		
+		//enum StatemachineEvaluationType:
+		//	IP_ADDRESS="getIPAddress" | NOW="getNow" | USER_AGENT_INFO="getUserAgentInfo" | IS_TOUCH_DEVICE="isTouchDevice" |
+		//	IS_HTTPS="isHttps" | BROWSER_LOCALE="getBrowserLocale" | USER_NAME="getUserName" | USER_PASSWORD="getUserPassword" |
+		//	USER_EMAIL="getUserEmail" | USER_POSITION="getUserPosition" | USER_PRTSERVICE="getUserPrintService" |
+		//	SCREEN_WIDTH="getSceenWidth" | SCREEN_HEIGHT="getScreenHeight" | TRIGGER="getTrigger";
+		public EnumRule getRule() { return rule; }
+
+		//IP_ADDRESS="getIPAddress" | NOW="getNow" | USER_AGENT_INFO="getUserAgentInfo" | IS_TOUCH_DEVICE="isTouchDevice" |
+		//IS_HTTPS="isHttps" | BROWSER_LOCALE="getBrowserLocale" | USER_NAME="getUserName" | USER_PASSWORD="getUserPassword" |
+		//USER_EMAIL="getUserEmail" | USER_POSITION="getUserPosition" | USER_PRTSERVICE="getUserPrintService" |
+		//SCREEN_WIDTH="getSceenWidth" | SCREEN_HEIGHT="getScreenHeight" | TRIGGER="getTrigger"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//IP_ADDRESS="getIPAddress"
+		public EnumLiteralDeclaration getIP_ADDRESSEnumLiteralDeclaration_0() { return cIP_ADDRESSEnumLiteralDeclaration_0; }
+
+		//"getIPAddress"
+		public Keyword getIP_ADDRESSGetIPAddressKeyword_0_0() { return cIP_ADDRESSGetIPAddressKeyword_0_0; }
+
+		//NOW="getNow"
+		public EnumLiteralDeclaration getNOWEnumLiteralDeclaration_1() { return cNOWEnumLiteralDeclaration_1; }
+
+		//"getNow"
+		public Keyword getNOWGetNowKeyword_1_0() { return cNOWGetNowKeyword_1_0; }
+
+		//USER_AGENT_INFO="getUserAgentInfo"
+		public EnumLiteralDeclaration getUSER_AGENT_INFOEnumLiteralDeclaration_2() { return cUSER_AGENT_INFOEnumLiteralDeclaration_2; }
+
+		//"getUserAgentInfo"
+		public Keyword getUSER_AGENT_INFOGetUserAgentInfoKeyword_2_0() { return cUSER_AGENT_INFOGetUserAgentInfoKeyword_2_0; }
+
+		//IS_TOUCH_DEVICE="isTouchDevice"
+		public EnumLiteralDeclaration getIS_TOUCH_DEVICEEnumLiteralDeclaration_3() { return cIS_TOUCH_DEVICEEnumLiteralDeclaration_3; }
+
+		//"isTouchDevice"
+		public Keyword getIS_TOUCH_DEVICEIsTouchDeviceKeyword_3_0() { return cIS_TOUCH_DEVICEIsTouchDeviceKeyword_3_0; }
+
+		//IS_HTTPS="isHttps"
+		public EnumLiteralDeclaration getIS_HTTPSEnumLiteralDeclaration_4() { return cIS_HTTPSEnumLiteralDeclaration_4; }
+
+		//"isHttps"
+		public Keyword getIS_HTTPSIsHttpsKeyword_4_0() { return cIS_HTTPSIsHttpsKeyword_4_0; }
+
+		//BROWSER_LOCALE="getBrowserLocale"
+		public EnumLiteralDeclaration getBROWSER_LOCALEEnumLiteralDeclaration_5() { return cBROWSER_LOCALEEnumLiteralDeclaration_5; }
+
+		//"getBrowserLocale"
+		public Keyword getBROWSER_LOCALEGetBrowserLocaleKeyword_5_0() { return cBROWSER_LOCALEGetBrowserLocaleKeyword_5_0; }
+
+		//USER_NAME="getUserName"
+		public EnumLiteralDeclaration getUSER_NAMEEnumLiteralDeclaration_6() { return cUSER_NAMEEnumLiteralDeclaration_6; }
+
+		//"getUserName"
+		public Keyword getUSER_NAMEGetUserNameKeyword_6_0() { return cUSER_NAMEGetUserNameKeyword_6_0; }
+
+		//USER_PASSWORD="getUserPassword"
+		public EnumLiteralDeclaration getUSER_PASSWORDEnumLiteralDeclaration_7() { return cUSER_PASSWORDEnumLiteralDeclaration_7; }
+
+		//"getUserPassword"
+		public Keyword getUSER_PASSWORDGetUserPasswordKeyword_7_0() { return cUSER_PASSWORDGetUserPasswordKeyword_7_0; }
+
+		//USER_EMAIL="getUserEmail"
+		public EnumLiteralDeclaration getUSER_EMAILEnumLiteralDeclaration_8() { return cUSER_EMAILEnumLiteralDeclaration_8; }
+
+		//"getUserEmail"
+		public Keyword getUSER_EMAILGetUserEmailKeyword_8_0() { return cUSER_EMAILGetUserEmailKeyword_8_0; }
+
+		//USER_POSITION="getUserPosition"
+		public EnumLiteralDeclaration getUSER_POSITIONEnumLiteralDeclaration_9() { return cUSER_POSITIONEnumLiteralDeclaration_9; }
+
+		//"getUserPosition"
+		public Keyword getUSER_POSITIONGetUserPositionKeyword_9_0() { return cUSER_POSITIONGetUserPositionKeyword_9_0; }
+
+		//USER_PRTSERVICE="getUserPrintService"
+		public EnumLiteralDeclaration getUSER_PRTSERVICEEnumLiteralDeclaration_10() { return cUSER_PRTSERVICEEnumLiteralDeclaration_10; }
+
+		//"getUserPrintService"
+		public Keyword getUSER_PRTSERVICEGetUserPrintServiceKeyword_10_0() { return cUSER_PRTSERVICEGetUserPrintServiceKeyword_10_0; }
+
+		//SCREEN_WIDTH="getSceenWidth"
+		public EnumLiteralDeclaration getSCREEN_WIDTHEnumLiteralDeclaration_11() { return cSCREEN_WIDTHEnumLiteralDeclaration_11; }
+
+		//"getSceenWidth"
+		public Keyword getSCREEN_WIDTHGetSceenWidthKeyword_11_0() { return cSCREEN_WIDTHGetSceenWidthKeyword_11_0; }
+
+		//SCREEN_HEIGHT="getScreenHeight"
+		public EnumLiteralDeclaration getSCREEN_HEIGHTEnumLiteralDeclaration_12() { return cSCREEN_HEIGHTEnumLiteralDeclaration_12; }
+
+		//"getScreenHeight"
+		public Keyword getSCREEN_HEIGHTGetScreenHeightKeyword_12_0() { return cSCREEN_HEIGHTGetScreenHeightKeyword_12_0; }
+
+		//TRIGGER="getTrigger"
+		public EnumLiteralDeclaration getTRIGGEREnumLiteralDeclaration_13() { return cTRIGGEREnumLiteralDeclaration_13; }
+
+		//"getTrigger"
+		public Keyword getTRIGGERGetTriggerKeyword_13_0() { return cTRIGGERGetTriggerKeyword_13_0; }
+	}
+
+	public class StatemachineUserMessageTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineUserMessageType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cHUMANIZED_MESSAGEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cHUMANIZED_MESSAGEHumanizedKeyword_0_0 = (Keyword)cHUMANIZED_MESSAGEEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cWARNING_MESSAGEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cWARNING_MESSAGEWarningKeyword_1_0 = (Keyword)cWARNING_MESSAGEEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cERROR_MESSAGEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cERROR_MESSAGEErrorKeyword_2_0 = (Keyword)cERROR_MESSAGEEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cTRAY_NOTIFICATIONEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cTRAY_NOTIFICATIONTrayKeyword_3_0 = (Keyword)cTRAY_NOTIFICATIONEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cASSISTIVE_NOTIFICATIONAssistiveKeyword_4_0 = (Keyword)cASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4.eContents().get(0);
+		
+		//enum StatemachineUserMessageType:
+		//	HUMANIZED_MESSAGE="humanized" | WARNING_MESSAGE="warning" | ERROR_MESSAGE="error" | TRAY_NOTIFICATION="tray" |
+		//	ASSISTIVE_NOTIFICATION="assistive";
+		public EnumRule getRule() { return rule; }
+
+		//HUMANIZED_MESSAGE="humanized" | WARNING_MESSAGE="warning" | ERROR_MESSAGE="error" | TRAY_NOTIFICATION="tray" |
+		//ASSISTIVE_NOTIFICATION="assistive"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//HUMANIZED_MESSAGE="humanized"
+		public EnumLiteralDeclaration getHUMANIZED_MESSAGEEnumLiteralDeclaration_0() { return cHUMANIZED_MESSAGEEnumLiteralDeclaration_0; }
+
+		//"humanized"
+		public Keyword getHUMANIZED_MESSAGEHumanizedKeyword_0_0() { return cHUMANIZED_MESSAGEHumanizedKeyword_0_0; }
+
+		//WARNING_MESSAGE="warning"
+		public EnumLiteralDeclaration getWARNING_MESSAGEEnumLiteralDeclaration_1() { return cWARNING_MESSAGEEnumLiteralDeclaration_1; }
+
+		//"warning"
+		public Keyword getWARNING_MESSAGEWarningKeyword_1_0() { return cWARNING_MESSAGEWarningKeyword_1_0; }
+
+		//ERROR_MESSAGE="error"
+		public EnumLiteralDeclaration getERROR_MESSAGEEnumLiteralDeclaration_2() { return cERROR_MESSAGEEnumLiteralDeclaration_2; }
+
+		//"error"
+		public Keyword getERROR_MESSAGEErrorKeyword_2_0() { return cERROR_MESSAGEErrorKeyword_2_0; }
+
+		//TRAY_NOTIFICATION="tray"
+		public EnumLiteralDeclaration getTRAY_NOTIFICATIONEnumLiteralDeclaration_3() { return cTRAY_NOTIFICATIONEnumLiteralDeclaration_3; }
+
+		//"tray"
+		public Keyword getTRAY_NOTIFICATIONTrayKeyword_3_0() { return cTRAY_NOTIFICATIONTrayKeyword_3_0; }
+
+		//ASSISTIVE_NOTIFICATION="assistive"
+		public EnumLiteralDeclaration getASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4() { return cASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4; }
+
+		//"assistive"
+		public Keyword getASSISTIVE_NOTIFICATIONAssistiveKeyword_4_0() { return cASSISTIVE_NOTIFICATIONAssistiveKeyword_4_0; }
+	}
+
+	public class StatemachineLineDisplayCursorTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineLineDisplayCursorType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cDISP_CT_NONEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cDISP_CT_NONENoneKeyword_0_0 = (Keyword)cDISP_CT_NONEEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_CT_FIXEDEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cDISP_CT_FIXEDFixedKeyword_1_0 = (Keyword)cDISP_CT_FIXEDEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_CT_BLOCKEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cDISP_CT_BLOCKBlockKeyword_2_0 = (Keyword)cDISP_CT_BLOCKEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_CT_HALFBLOCKEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cDISP_CT_HALFBLOCKHalfblockKeyword_3_0 = (Keyword)cDISP_CT_HALFBLOCKEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_CT_UNDERLINEEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cDISP_CT_UNDERLINEUnderlineKeyword_4_0 = (Keyword)cDISP_CT_UNDERLINEEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_CT_REVERSEEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cDISP_CT_REVERSEReverseKeyword_5_0 = (Keyword)cDISP_CT_REVERSEEnumLiteralDeclaration_5.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_CT_OTHEREnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
+		private final Keyword cDISP_CT_OTHEROtherKeyword_6_0 = (Keyword)cDISP_CT_OTHEREnumLiteralDeclaration_6.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_CT_BLINKEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
+		private final Keyword cDISP_CT_BLINKBlinkKeyword_7_0 = (Keyword)cDISP_CT_BLINKEnumLiteralDeclaration_7.eContents().get(0);
+		
+		//enum StatemachineLineDisplayCursorType:
+		//	DISP_CT_NONE="none" | DISP_CT_FIXED="fixed" | DISP_CT_BLOCK="block" | DISP_CT_HALFBLOCK="halfblock" |
+		//	DISP_CT_UNDERLINE="underline" | DISP_CT_REVERSE="reverse" | DISP_CT_OTHER="other" | DISP_CT_BLINK="blink";
+		public EnumRule getRule() { return rule; }
+
+		//DISP_CT_NONE="none" | DISP_CT_FIXED="fixed" | DISP_CT_BLOCK="block" | DISP_CT_HALFBLOCK="halfblock" |
+		//DISP_CT_UNDERLINE="underline" | DISP_CT_REVERSE="reverse" | DISP_CT_OTHER="other" | DISP_CT_BLINK="blink"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//DISP_CT_NONE="none"
+		public EnumLiteralDeclaration getDISP_CT_NONEEnumLiteralDeclaration_0() { return cDISP_CT_NONEEnumLiteralDeclaration_0; }
+
+		//"none"
+		public Keyword getDISP_CT_NONENoneKeyword_0_0() { return cDISP_CT_NONENoneKeyword_0_0; }
+
+		//DISP_CT_FIXED="fixed"
+		public EnumLiteralDeclaration getDISP_CT_FIXEDEnumLiteralDeclaration_1() { return cDISP_CT_FIXEDEnumLiteralDeclaration_1; }
+
+		//"fixed"
+		public Keyword getDISP_CT_FIXEDFixedKeyword_1_0() { return cDISP_CT_FIXEDFixedKeyword_1_0; }
+
+		//DISP_CT_BLOCK="block"
+		public EnumLiteralDeclaration getDISP_CT_BLOCKEnumLiteralDeclaration_2() { return cDISP_CT_BLOCKEnumLiteralDeclaration_2; }
+
+		//"block"
+		public Keyword getDISP_CT_BLOCKBlockKeyword_2_0() { return cDISP_CT_BLOCKBlockKeyword_2_0; }
+
+		//DISP_CT_HALFBLOCK="halfblock"
+		public EnumLiteralDeclaration getDISP_CT_HALFBLOCKEnumLiteralDeclaration_3() { return cDISP_CT_HALFBLOCKEnumLiteralDeclaration_3; }
+
+		//"halfblock"
+		public Keyword getDISP_CT_HALFBLOCKHalfblockKeyword_3_0() { return cDISP_CT_HALFBLOCKHalfblockKeyword_3_0; }
+
+		//DISP_CT_UNDERLINE="underline"
+		public EnumLiteralDeclaration getDISP_CT_UNDERLINEEnumLiteralDeclaration_4() { return cDISP_CT_UNDERLINEEnumLiteralDeclaration_4; }
+
+		//"underline"
+		public Keyword getDISP_CT_UNDERLINEUnderlineKeyword_4_0() { return cDISP_CT_UNDERLINEUnderlineKeyword_4_0; }
+
+		//DISP_CT_REVERSE="reverse"
+		public EnumLiteralDeclaration getDISP_CT_REVERSEEnumLiteralDeclaration_5() { return cDISP_CT_REVERSEEnumLiteralDeclaration_5; }
+
+		//"reverse"
+		public Keyword getDISP_CT_REVERSEReverseKeyword_5_0() { return cDISP_CT_REVERSEReverseKeyword_5_0; }
+
+		//DISP_CT_OTHER="other"
+		public EnumLiteralDeclaration getDISP_CT_OTHEREnumLiteralDeclaration_6() { return cDISP_CT_OTHEREnumLiteralDeclaration_6; }
+
+		//"other"
+		public Keyword getDISP_CT_OTHEROtherKeyword_6_0() { return cDISP_CT_OTHEROtherKeyword_6_0; }
+
+		//DISP_CT_BLINK="blink"
+		public EnumLiteralDeclaration getDISP_CT_BLINKEnumLiteralDeclaration_7() { return cDISP_CT_BLINKEnumLiteralDeclaration_7; }
+
+		//"blink"
+		public Keyword getDISP_CT_BLINKBlinkKeyword_7_0() { return cDISP_CT_BLINKBlinkKeyword_7_0; }
+	}
+
+	public class StatemachineLineDisplayMarqueeTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineLineDisplayMarqueeType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cDISP_MT_NONEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cDISP_MT_NONENoneKeyword_0_0 = (Keyword)cDISP_MT_NONEEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_MT_UPEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cDISP_MT_UPUpKeyword_1_0 = (Keyword)cDISP_MT_UPEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_MT_DOWNEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cDISP_MT_DOWNDownKeyword_2_0 = (Keyword)cDISP_MT_DOWNEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_MT_LEFTEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cDISP_MT_LEFTLeftKeyword_3_0 = (Keyword)cDISP_MT_LEFTEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_MT_RIGHTEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cDISP_MT_RIGHTRightKeyword_4_0 = (Keyword)cDISP_MT_RIGHTEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_MT_INITEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cDISP_MT_INITInitKeyword_5_0 = (Keyword)cDISP_MT_INITEnumLiteralDeclaration_5.eContents().get(0);
+		
+		//enum StatemachineLineDisplayMarqueeType:
+		//	DISP_MT_NONE="none" | DISP_MT_UP="up" | DISP_MT_DOWN="down" | DISP_MT_LEFT="left" | DISP_MT_RIGHT="right" |
+		//	DISP_MT_INIT="init";
+		public EnumRule getRule() { return rule; }
+
+		//DISP_MT_NONE="none" | DISP_MT_UP="up" | DISP_MT_DOWN="down" | DISP_MT_LEFT="left" | DISP_MT_RIGHT="right" |
+		//DISP_MT_INIT="init"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//DISP_MT_NONE="none"
+		public EnumLiteralDeclaration getDISP_MT_NONEEnumLiteralDeclaration_0() { return cDISP_MT_NONEEnumLiteralDeclaration_0; }
+
+		//"none"
+		public Keyword getDISP_MT_NONENoneKeyword_0_0() { return cDISP_MT_NONENoneKeyword_0_0; }
+
+		//DISP_MT_UP="up"
+		public EnumLiteralDeclaration getDISP_MT_UPEnumLiteralDeclaration_1() { return cDISP_MT_UPEnumLiteralDeclaration_1; }
+
+		//"up"
+		public Keyword getDISP_MT_UPUpKeyword_1_0() { return cDISP_MT_UPUpKeyword_1_0; }
+
+		//DISP_MT_DOWN="down"
+		public EnumLiteralDeclaration getDISP_MT_DOWNEnumLiteralDeclaration_2() { return cDISP_MT_DOWNEnumLiteralDeclaration_2; }
+
+		//"down"
+		public Keyword getDISP_MT_DOWNDownKeyword_2_0() { return cDISP_MT_DOWNDownKeyword_2_0; }
+
+		//DISP_MT_LEFT="left"
+		public EnumLiteralDeclaration getDISP_MT_LEFTEnumLiteralDeclaration_3() { return cDISP_MT_LEFTEnumLiteralDeclaration_3; }
+
+		//"left"
+		public Keyword getDISP_MT_LEFTLeftKeyword_3_0() { return cDISP_MT_LEFTLeftKeyword_3_0; }
+
+		//DISP_MT_RIGHT="right"
+		public EnumLiteralDeclaration getDISP_MT_RIGHTEnumLiteralDeclaration_4() { return cDISP_MT_RIGHTEnumLiteralDeclaration_4; }
+
+		//"right"
+		public Keyword getDISP_MT_RIGHTRightKeyword_4_0() { return cDISP_MT_RIGHTRightKeyword_4_0; }
+
+		//DISP_MT_INIT="init"
+		public EnumLiteralDeclaration getDISP_MT_INITEnumLiteralDeclaration_5() { return cDISP_MT_INITEnumLiteralDeclaration_5; }
+
+		//"init"
+		public Keyword getDISP_MT_INITInitKeyword_5_0() { return cDISP_MT_INITInitKeyword_5_0; }
+	}
+
+	public class StatemachineLineDisplayMarqueeFormatElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineLineDisplayMarqueeFormat");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cDISP_MF_WALKEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cDISP_MF_WALKWalkKeyword_0_0 = (Keyword)cDISP_MF_WALKEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_MF_PLACEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cDISP_MF_PLACEPlaceKeyword_1_0 = (Keyword)cDISP_MF_PLACEEnumLiteralDeclaration_1.eContents().get(0);
+		
+		//enum StatemachineLineDisplayMarqueeFormat:
+		//	DISP_MF_WALK="walk" | DISP_MF_PLACE="place";
+		public EnumRule getRule() { return rule; }
+
+		//DISP_MF_WALK="walk" | DISP_MF_PLACE="place"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//DISP_MF_WALK="walk"
+		public EnumLiteralDeclaration getDISP_MF_WALKEnumLiteralDeclaration_0() { return cDISP_MF_WALKEnumLiteralDeclaration_0; }
+
+		//"walk"
+		public Keyword getDISP_MF_WALKWalkKeyword_0_0() { return cDISP_MF_WALKWalkKeyword_0_0; }
+
+		//DISP_MF_PLACE="place"
+		public EnumLiteralDeclaration getDISP_MF_PLACEEnumLiteralDeclaration_1() { return cDISP_MF_PLACEEnumLiteralDeclaration_1; }
+
+		//"place"
+		public Keyword getDISP_MF_PLACEPlaceKeyword_1_0() { return cDISP_MF_PLACEPlaceKeyword_1_0; }
+	}
+
+	public class StatemachineLineDisplayTextTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineLineDisplayTextType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cDISP_DT_NORMALEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cDISP_DT_NORMALNormalKeyword_0_0 = (Keyword)cDISP_DT_NORMALEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_DT_BLINKEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cDISP_DT_BLINKBlinkKeyword_1_0 = (Keyword)cDISP_DT_BLINKEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_DT_REVERSEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cDISP_DT_REVERSEReverseKeyword_2_0 = (Keyword)cDISP_DT_REVERSEEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cDISP_DT_BLINK_REVERSEBlinkreverseKeyword_3_0 = (Keyword)cDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum StatemachineLineDisplayTextType:
+		//	DISP_DT_NORMAL="normal" | DISP_DT_BLINK="blink" | DISP_DT_REVERSE="reverse" | DISP_DT_BLINK_REVERSE="blinkreverse";
+		public EnumRule getRule() { return rule; }
+
+		//DISP_DT_NORMAL="normal" | DISP_DT_BLINK="blink" | DISP_DT_REVERSE="reverse" | DISP_DT_BLINK_REVERSE="blinkreverse"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//DISP_DT_NORMAL="normal"
+		public EnumLiteralDeclaration getDISP_DT_NORMALEnumLiteralDeclaration_0() { return cDISP_DT_NORMALEnumLiteralDeclaration_0; }
+
+		//"normal"
+		public Keyword getDISP_DT_NORMALNormalKeyword_0_0() { return cDISP_DT_NORMALNormalKeyword_0_0; }
+
+		//DISP_DT_BLINK="blink"
+		public EnumLiteralDeclaration getDISP_DT_BLINKEnumLiteralDeclaration_1() { return cDISP_DT_BLINKEnumLiteralDeclaration_1; }
+
+		//"blink"
+		public Keyword getDISP_DT_BLINKBlinkKeyword_1_0() { return cDISP_DT_BLINKBlinkKeyword_1_0; }
+
+		//DISP_DT_REVERSE="reverse"
+		public EnumLiteralDeclaration getDISP_DT_REVERSEEnumLiteralDeclaration_2() { return cDISP_DT_REVERSEEnumLiteralDeclaration_2; }
+
+		//"reverse"
+		public Keyword getDISP_DT_REVERSEReverseKeyword_2_0() { return cDISP_DT_REVERSEReverseKeyword_2_0; }
+
+		//DISP_DT_BLINK_REVERSE="blinkreverse"
+		public EnumLiteralDeclaration getDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3() { return cDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3; }
+
+		//"blinkreverse"
+		public Keyword getDISP_DT_BLINK_REVERSEBlinkreverseKeyword_3_0() { return cDISP_DT_BLINK_REVERSEBlinkreverseKeyword_3_0; }
+	}
+
+	public class StatemachineLineDisplayScrollTextTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachineLineDisplayScrollTextType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cDISP_ST_UPEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cDISP_ST_UPUpKeyword_0_0 = (Keyword)cDISP_ST_UPEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_ST_DOWNEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cDISP_ST_DOWNDownKeyword_1_0 = (Keyword)cDISP_ST_DOWNEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_ST_LEFTEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cDISP_ST_LEFTLeftKeyword_2_0 = (Keyword)cDISP_ST_LEFTEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cDISP_ST_RIGHTEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cDISP_ST_RIGHTRightKeyword_3_0 = (Keyword)cDISP_ST_RIGHTEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum StatemachineLineDisplayScrollTextType:
+		//	DISP_ST_UP="up" | DISP_ST_DOWN="down" | DISP_ST_LEFT="left" | DISP_ST_RIGHT="right";
+		public EnumRule getRule() { return rule; }
+
+		//DISP_ST_UP="up" | DISP_ST_DOWN="down" | DISP_ST_LEFT="left" | DISP_ST_RIGHT="right"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//DISP_ST_UP="up"
+		public EnumLiteralDeclaration getDISP_ST_UPEnumLiteralDeclaration_0() { return cDISP_ST_UPEnumLiteralDeclaration_0; }
+
+		//"up"
+		public Keyword getDISP_ST_UPUpKeyword_0_0() { return cDISP_ST_UPUpKeyword_0_0; }
+
+		//DISP_ST_DOWN="down"
+		public EnumLiteralDeclaration getDISP_ST_DOWNEnumLiteralDeclaration_1() { return cDISP_ST_DOWNEnumLiteralDeclaration_1; }
+
+		//"down"
+		public Keyword getDISP_ST_DOWNDownKeyword_1_0() { return cDISP_ST_DOWNDownKeyword_1_0; }
+
+		//DISP_ST_LEFT="left"
+		public EnumLiteralDeclaration getDISP_ST_LEFTEnumLiteralDeclaration_2() { return cDISP_ST_LEFTEnumLiteralDeclaration_2; }
+
+		//"left"
+		public Keyword getDISP_ST_LEFTLeftKeyword_2_0() { return cDISP_ST_LEFTLeftKeyword_2_0; }
+
+		//DISP_ST_RIGHT="right"
+		public EnumLiteralDeclaration getDISP_ST_RIGHTEnumLiteralDeclaration_3() { return cDISP_ST_RIGHTEnumLiteralDeclaration_3; }
+
+		//"right"
+		public Keyword getDISP_ST_RIGHTRightKeyword_3_0() { return cDISP_ST_RIGHTRightKeyword_3_0; }
+	}
+
+	public class StatemachinePOSPrinterBarcodeTypeElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StatemachinePOSPrinterBarcodeType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCAEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cPTR_BCS_UPCAUpcaKeyword_0_0 = (Keyword)cPTR_BCS_UPCAEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cPTR_BCS_UPCEUpcbKeyword_1_0 = (Keyword)cPTR_BCS_UPCEEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_JAN8EnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cPTR_BCS_JAN8Jan8Keyword_2_0 = (Keyword)cPTR_BCS_JAN8EnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_EAN8EnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cPTR_BCS_EAN8Ean8Keyword_3_0 = (Keyword)cPTR_BCS_EAN8EnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_JAN13EnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cPTR_BCS_JAN13Jan13Keyword_4_0 = (Keyword)cPTR_BCS_JAN13EnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_EAN13EnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cPTR_BCS_EAN13Ean13Keyword_5_0 = (Keyword)cPTR_BCS_EAN13EnumLiteralDeclaration_5.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_TFEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
+		private final Keyword cPTR_BCS_TFTfKeyword_6_0 = (Keyword)cPTR_BCS_TFEnumLiteralDeclaration_6.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_ITFEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
+		private final Keyword cPTR_BCS_ITFItfKeyword_7_0 = (Keyword)cPTR_BCS_ITFEnumLiteralDeclaration_7.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_CodabarEnumLiteralDeclaration_8 = (EnumLiteralDeclaration)cAlternatives.eContents().get(8);
+		private final Keyword cPTR_BCS_CodabarCodeabarKeyword_8_0 = (Keyword)cPTR_BCS_CodabarEnumLiteralDeclaration_8.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_Code39EnumLiteralDeclaration_9 = (EnumLiteralDeclaration)cAlternatives.eContents().get(9);
+		private final Keyword cPTR_BCS_Code39Code39Keyword_9_0 = (Keyword)cPTR_BCS_Code39EnumLiteralDeclaration_9.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_Code93EnumLiteralDeclaration_10 = (EnumLiteralDeclaration)cAlternatives.eContents().get(10);
+		private final Keyword cPTR_BCS_Code93Code93Keyword_10_0 = (Keyword)cPTR_BCS_Code93EnumLiteralDeclaration_10.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_Code128EnumLiteralDeclaration_11 = (EnumLiteralDeclaration)cAlternatives.eContents().get(11);
+		private final Keyword cPTR_BCS_Code128Code128Keyword_11_0 = (Keyword)cPTR_BCS_Code128EnumLiteralDeclaration_11.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCA_SEnumLiteralDeclaration_12 = (EnumLiteralDeclaration)cAlternatives.eContents().get(12);
+		private final Keyword cPTR_BCS_UPCA_SUpca_sKeyword_12_0 = (Keyword)cPTR_BCS_UPCA_SEnumLiteralDeclaration_12.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCE_SEnumLiteralDeclaration_13 = (EnumLiteralDeclaration)cAlternatives.eContents().get(13);
+		private final Keyword cPTR_BCS_UPCE_SUpce_sKeyword_13_0 = (Keyword)cPTR_BCS_UPCE_SEnumLiteralDeclaration_13.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCD1EnumLiteralDeclaration_14 = (EnumLiteralDeclaration)cAlternatives.eContents().get(14);
+		private final Keyword cPTR_BCS_UPCD1Upcd1Keyword_14_0 = (Keyword)cPTR_BCS_UPCD1EnumLiteralDeclaration_14.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCD2EnumLiteralDeclaration_15 = (EnumLiteralDeclaration)cAlternatives.eContents().get(15);
+		private final Keyword cPTR_BCS_UPCD2Upcd2Keyword_15_0 = (Keyword)cPTR_BCS_UPCD2EnumLiteralDeclaration_15.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCD3EnumLiteralDeclaration_16 = (EnumLiteralDeclaration)cAlternatives.eContents().get(16);
+		private final Keyword cPTR_BCS_UPCD3Upcd3Keyword_16_0 = (Keyword)cPTR_BCS_UPCD3EnumLiteralDeclaration_16.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCD4EnumLiteralDeclaration_17 = (EnumLiteralDeclaration)cAlternatives.eContents().get(17);
+		private final Keyword cPTR_BCS_UPCD4Upcd4Keyword_17_0 = (Keyword)cPTR_BCS_UPCD4EnumLiteralDeclaration_17.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPCD5EnumLiteralDeclaration_18 = (EnumLiteralDeclaration)cAlternatives.eContents().get(18);
+		private final Keyword cPTR_BCS_UPCD5Upcd5Keyword_18_0 = (Keyword)cPTR_BCS_UPCD5EnumLiteralDeclaration_18.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_EAN8_SEnumLiteralDeclaration_19 = (EnumLiteralDeclaration)cAlternatives.eContents().get(19);
+		private final Keyword cPTR_BCS_EAN8_SEan8_sKeyword_19_0 = (Keyword)cPTR_BCS_EAN8_SEnumLiteralDeclaration_19.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_EAN13_SEnumLiteralDeclaration_20 = (EnumLiteralDeclaration)cAlternatives.eContents().get(20);
+		private final Keyword cPTR_BCS_EAN13_SEan13_sKeyword_20_0 = (Keyword)cPTR_BCS_EAN13_SEnumLiteralDeclaration_20.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_EAN128EnumLiteralDeclaration_21 = (EnumLiteralDeclaration)cAlternatives.eContents().get(21);
+		private final Keyword cPTR_BCS_EAN128Ean128Keyword_21_0 = (Keyword)cPTR_BCS_EAN128EnumLiteralDeclaration_21.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_OCRAEnumLiteralDeclaration_22 = (EnumLiteralDeclaration)cAlternatives.eContents().get(22);
+		private final Keyword cPTR_BCS_OCRAOrcaKeyword_22_0 = (Keyword)cPTR_BCS_OCRAEnumLiteralDeclaration_22.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_OCRBEnumLiteralDeclaration_23 = (EnumLiteralDeclaration)cAlternatives.eContents().get(23);
+		private final Keyword cPTR_BCS_OCRBOcrbKeyword_23_0 = (Keyword)cPTR_BCS_OCRBEnumLiteralDeclaration_23.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24 = (EnumLiteralDeclaration)cAlternatives.eContents().get(24);
+		private final Keyword cPTR_BCS_Code128_ParsedCode128_parsedKeyword_24_0 = (Keyword)cPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_GS1DATABAREnumLiteralDeclaration_25 = (EnumLiteralDeclaration)cAlternatives.eContents().get(25);
+		private final Keyword cPTR_BCS_GS1DATABARGs1databarKeyword_25_0 = (Keyword)cPTR_BCS_GS1DATABAREnumLiteralDeclaration_25.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26 = (EnumLiteralDeclaration)cAlternatives.eContents().get(26);
+		private final Keyword cPTR_BCS_GS1DATABAR_EGs1databar_eKeyword_26_0 = (Keyword)cPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27 = (EnumLiteralDeclaration)cAlternatives.eContents().get(27);
+		private final Keyword cPTR_BCS_GS1DATABAR_SGs1databar_sKeyword_27_0 = (Keyword)cPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28 = (EnumLiteralDeclaration)cAlternatives.eContents().get(28);
+		private final Keyword cPTR_BCS_GS1DATABAR_E_SGs1databar_e_sKeyword_28_0 = (Keyword)cPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_PDF417EnumLiteralDeclaration_29 = (EnumLiteralDeclaration)cAlternatives.eContents().get(29);
+		private final Keyword cPTR_BCS_PDF417Pdf417Keyword_29_0 = (Keyword)cPTR_BCS_PDF417EnumLiteralDeclaration_29.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_MAXICODEEnumLiteralDeclaration_30 = (EnumLiteralDeclaration)cAlternatives.eContents().get(30);
+		private final Keyword cPTR_BCS_MAXICODEMaxicodeKeyword_30_0 = (Keyword)cPTR_BCS_MAXICODEEnumLiteralDeclaration_30.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31 = (EnumLiteralDeclaration)cAlternatives.eContents().get(31);
+		private final Keyword cPTR_BCS_DATAMATRIXDatamatrixKeyword_31_0 = (Keyword)cPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_QRCODEEnumLiteralDeclaration_32 = (EnumLiteralDeclaration)cAlternatives.eContents().get(32);
+		private final Keyword cPTR_BCS_QRCODEQrcodeKeyword_32_0 = (Keyword)cPTR_BCS_QRCODEEnumLiteralDeclaration_32.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UQRCODEEnumLiteralDeclaration_33 = (EnumLiteralDeclaration)cAlternatives.eContents().get(33);
+		private final Keyword cPTR_BCS_UQRCODEUqrcodeKeyword_33_0 = (Keyword)cPTR_BCS_UQRCODEEnumLiteralDeclaration_33.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_AZTECEnumLiteralDeclaration_34 = (EnumLiteralDeclaration)cAlternatives.eContents().get(34);
+		private final Keyword cPTR_BCS_AZTECAztecKeyword_34_0 = (Keyword)cPTR_BCS_AZTECEnumLiteralDeclaration_34.eContents().get(0);
+		private final EnumLiteralDeclaration cPTR_BCS_UPDF417EnumLiteralDeclaration_35 = (EnumLiteralDeclaration)cAlternatives.eContents().get(35);
+		private final Keyword cPTR_BCS_UPDF417Updf417Keyword_35_0 = (Keyword)cPTR_BCS_UPDF417EnumLiteralDeclaration_35.eContents().get(0);
+		
+		//enum StatemachinePOSPrinterBarcodeType:
+		//	PTR_BCS_UPCA="upca" | PTR_BCS_UPCE="upcb" | PTR_BCS_JAN8="jan8" | PTR_BCS_EAN8="ean8" | PTR_BCS_JAN13="jan13" |
+		//	PTR_BCS_EAN13="ean13" | PTR_BCS_TF="tf" | PTR_BCS_ITF="itf" | PTR_BCS_Codabar="codeabar" | PTR_BCS_Code39="code39" |
+		//	PTR_BCS_Code93="code93" | PTR_BCS_Code128="code128" | PTR_BCS_UPCA_S="upca_s" | PTR_BCS_UPCE_S="upce_s" |
+		//	PTR_BCS_UPCD1="upcd1" | PTR_BCS_UPCD2="upcd2" | PTR_BCS_UPCD3="upcd3" | PTR_BCS_UPCD4="upcd4" | PTR_BCS_UPCD5="upcd5"
+		//	| PTR_BCS_EAN8_S="ean8_s" | PTR_BCS_EAN13_S="ean13_s" | PTR_BCS_EAN128="ean128" | PTR_BCS_OCRA="orca" |
+		//	PTR_BCS_OCRB="ocrb" | PTR_BCS_Code128_Parsed="code128_parsed" | PTR_BCS_GS1DATABAR="gs1databar" |
+		//	PTR_BCS_GS1DATABAR_E="gs1databar_e" | PTR_BCS_GS1DATABAR_S="gs1databar_s" | PTR_BCS_GS1DATABAR_E_S="gs1databar_e_s" |
+		//	PTR_BCS_PDF417="pdf417" | PTR_BCS_MAXICODE="maxicode" | PTR_BCS_DATAMATRIX="datamatrix" | PTR_BCS_QRCODE="qrcode" |
+		//	PTR_BCS_UQRCODE="uqrcode" | PTR_BCS_AZTEC="aztec" | PTR_BCS_UPDF417="updf417";
+		public EnumRule getRule() { return rule; }
+
+		//PTR_BCS_UPCA="upca" | PTR_BCS_UPCE="upcb" | PTR_BCS_JAN8="jan8" | PTR_BCS_EAN8="ean8" | PTR_BCS_JAN13="jan13" |
+		//PTR_BCS_EAN13="ean13" | PTR_BCS_TF="tf" | PTR_BCS_ITF="itf" | PTR_BCS_Codabar="codeabar" | PTR_BCS_Code39="code39" |
+		//PTR_BCS_Code93="code93" | PTR_BCS_Code128="code128" | PTR_BCS_UPCA_S="upca_s" | PTR_BCS_UPCE_S="upce_s" |
+		//PTR_BCS_UPCD1="upcd1" | PTR_BCS_UPCD2="upcd2" | PTR_BCS_UPCD3="upcd3" | PTR_BCS_UPCD4="upcd4" | PTR_BCS_UPCD5="upcd5"
+		//| PTR_BCS_EAN8_S="ean8_s" | PTR_BCS_EAN13_S="ean13_s" | PTR_BCS_EAN128="ean128" | PTR_BCS_OCRA="orca" |
+		//PTR_BCS_OCRB="ocrb" | PTR_BCS_Code128_Parsed="code128_parsed" | PTR_BCS_GS1DATABAR="gs1databar" |
+		//PTR_BCS_GS1DATABAR_E="gs1databar_e" | PTR_BCS_GS1DATABAR_S="gs1databar_s" | PTR_BCS_GS1DATABAR_E_S="gs1databar_e_s" |
+		//PTR_BCS_PDF417="pdf417" | PTR_BCS_MAXICODE="maxicode" | PTR_BCS_DATAMATRIX="datamatrix" | PTR_BCS_QRCODE="qrcode" |
+		//PTR_BCS_UQRCODE="uqrcode" | PTR_BCS_AZTEC="aztec" | PTR_BCS_UPDF417="updf417"
+		public Alternatives getAlternatives() { return cAlternatives; }
+
+		//PTR_BCS_UPCA="upca"
+		public EnumLiteralDeclaration getPTR_BCS_UPCAEnumLiteralDeclaration_0() { return cPTR_BCS_UPCAEnumLiteralDeclaration_0; }
+
+		//"upca"
+		public Keyword getPTR_BCS_UPCAUpcaKeyword_0_0() { return cPTR_BCS_UPCAUpcaKeyword_0_0; }
+
+		//PTR_BCS_UPCE="upcb"
+		public EnumLiteralDeclaration getPTR_BCS_UPCEEnumLiteralDeclaration_1() { return cPTR_BCS_UPCEEnumLiteralDeclaration_1; }
+
+		//"upcb"
+		public Keyword getPTR_BCS_UPCEUpcbKeyword_1_0() { return cPTR_BCS_UPCEUpcbKeyword_1_0; }
+
+		//PTR_BCS_JAN8="jan8"
+		public EnumLiteralDeclaration getPTR_BCS_JAN8EnumLiteralDeclaration_2() { return cPTR_BCS_JAN8EnumLiteralDeclaration_2; }
+
+		//"jan8"
+		public Keyword getPTR_BCS_JAN8Jan8Keyword_2_0() { return cPTR_BCS_JAN8Jan8Keyword_2_0; }
+
+		//PTR_BCS_EAN8="ean8"
+		public EnumLiteralDeclaration getPTR_BCS_EAN8EnumLiteralDeclaration_3() { return cPTR_BCS_EAN8EnumLiteralDeclaration_3; }
+
+		//"ean8"
+		public Keyword getPTR_BCS_EAN8Ean8Keyword_3_0() { return cPTR_BCS_EAN8Ean8Keyword_3_0; }
+
+		//PTR_BCS_JAN13="jan13"
+		public EnumLiteralDeclaration getPTR_BCS_JAN13EnumLiteralDeclaration_4() { return cPTR_BCS_JAN13EnumLiteralDeclaration_4; }
+
+		//"jan13"
+		public Keyword getPTR_BCS_JAN13Jan13Keyword_4_0() { return cPTR_BCS_JAN13Jan13Keyword_4_0; }
+
+		//PTR_BCS_EAN13="ean13"
+		public EnumLiteralDeclaration getPTR_BCS_EAN13EnumLiteralDeclaration_5() { return cPTR_BCS_EAN13EnumLiteralDeclaration_5; }
+
+		//"ean13"
+		public Keyword getPTR_BCS_EAN13Ean13Keyword_5_0() { return cPTR_BCS_EAN13Ean13Keyword_5_0; }
+
+		//PTR_BCS_TF="tf"
+		public EnumLiteralDeclaration getPTR_BCS_TFEnumLiteralDeclaration_6() { return cPTR_BCS_TFEnumLiteralDeclaration_6; }
+
+		//"tf"
+		public Keyword getPTR_BCS_TFTfKeyword_6_0() { return cPTR_BCS_TFTfKeyword_6_0; }
+
+		//PTR_BCS_ITF="itf"
+		public EnumLiteralDeclaration getPTR_BCS_ITFEnumLiteralDeclaration_7() { return cPTR_BCS_ITFEnumLiteralDeclaration_7; }
+
+		//"itf"
+		public Keyword getPTR_BCS_ITFItfKeyword_7_0() { return cPTR_BCS_ITFItfKeyword_7_0; }
+
+		//PTR_BCS_Codabar="codeabar"
+		public EnumLiteralDeclaration getPTR_BCS_CodabarEnumLiteralDeclaration_8() { return cPTR_BCS_CodabarEnumLiteralDeclaration_8; }
+
+		//"codeabar"
+		public Keyword getPTR_BCS_CodabarCodeabarKeyword_8_0() { return cPTR_BCS_CodabarCodeabarKeyword_8_0; }
+
+		//PTR_BCS_Code39="code39"
+		public EnumLiteralDeclaration getPTR_BCS_Code39EnumLiteralDeclaration_9() { return cPTR_BCS_Code39EnumLiteralDeclaration_9; }
+
+		//"code39"
+		public Keyword getPTR_BCS_Code39Code39Keyword_9_0() { return cPTR_BCS_Code39Code39Keyword_9_0; }
+
+		//PTR_BCS_Code93="code93"
+		public EnumLiteralDeclaration getPTR_BCS_Code93EnumLiteralDeclaration_10() { return cPTR_BCS_Code93EnumLiteralDeclaration_10; }
+
+		//"code93"
+		public Keyword getPTR_BCS_Code93Code93Keyword_10_0() { return cPTR_BCS_Code93Code93Keyword_10_0; }
+
+		//PTR_BCS_Code128="code128"
+		public EnumLiteralDeclaration getPTR_BCS_Code128EnumLiteralDeclaration_11() { return cPTR_BCS_Code128EnumLiteralDeclaration_11; }
+
+		//"code128"
+		public Keyword getPTR_BCS_Code128Code128Keyword_11_0() { return cPTR_BCS_Code128Code128Keyword_11_0; }
+
+		//PTR_BCS_UPCA_S="upca_s"
+		public EnumLiteralDeclaration getPTR_BCS_UPCA_SEnumLiteralDeclaration_12() { return cPTR_BCS_UPCA_SEnumLiteralDeclaration_12; }
+
+		//"upca_s"
+		public Keyword getPTR_BCS_UPCA_SUpca_sKeyword_12_0() { return cPTR_BCS_UPCA_SUpca_sKeyword_12_0; }
+
+		//PTR_BCS_UPCE_S="upce_s"
+		public EnumLiteralDeclaration getPTR_BCS_UPCE_SEnumLiteralDeclaration_13() { return cPTR_BCS_UPCE_SEnumLiteralDeclaration_13; }
+
+		//"upce_s"
+		public Keyword getPTR_BCS_UPCE_SUpce_sKeyword_13_0() { return cPTR_BCS_UPCE_SUpce_sKeyword_13_0; }
+
+		//PTR_BCS_UPCD1="upcd1"
+		public EnumLiteralDeclaration getPTR_BCS_UPCD1EnumLiteralDeclaration_14() { return cPTR_BCS_UPCD1EnumLiteralDeclaration_14; }
+
+		//"upcd1"
+		public Keyword getPTR_BCS_UPCD1Upcd1Keyword_14_0() { return cPTR_BCS_UPCD1Upcd1Keyword_14_0; }
+
+		//PTR_BCS_UPCD2="upcd2"
+		public EnumLiteralDeclaration getPTR_BCS_UPCD2EnumLiteralDeclaration_15() { return cPTR_BCS_UPCD2EnumLiteralDeclaration_15; }
+
+		//"upcd2"
+		public Keyword getPTR_BCS_UPCD2Upcd2Keyword_15_0() { return cPTR_BCS_UPCD2Upcd2Keyword_15_0; }
+
+		//PTR_BCS_UPCD3="upcd3"
+		public EnumLiteralDeclaration getPTR_BCS_UPCD3EnumLiteralDeclaration_16() { return cPTR_BCS_UPCD3EnumLiteralDeclaration_16; }
+
+		//"upcd3"
+		public Keyword getPTR_BCS_UPCD3Upcd3Keyword_16_0() { return cPTR_BCS_UPCD3Upcd3Keyword_16_0; }
+
+		//PTR_BCS_UPCD4="upcd4"
+		public EnumLiteralDeclaration getPTR_BCS_UPCD4EnumLiteralDeclaration_17() { return cPTR_BCS_UPCD4EnumLiteralDeclaration_17; }
+
+		//"upcd4"
+		public Keyword getPTR_BCS_UPCD4Upcd4Keyword_17_0() { return cPTR_BCS_UPCD4Upcd4Keyword_17_0; }
+
+		//PTR_BCS_UPCD5="upcd5"
+		public EnumLiteralDeclaration getPTR_BCS_UPCD5EnumLiteralDeclaration_18() { return cPTR_BCS_UPCD5EnumLiteralDeclaration_18; }
+
+		//"upcd5"
+		public Keyword getPTR_BCS_UPCD5Upcd5Keyword_18_0() { return cPTR_BCS_UPCD5Upcd5Keyword_18_0; }
+
+		//PTR_BCS_EAN8_S="ean8_s"
+		public EnumLiteralDeclaration getPTR_BCS_EAN8_SEnumLiteralDeclaration_19() { return cPTR_BCS_EAN8_SEnumLiteralDeclaration_19; }
+
+		//"ean8_s"
+		public Keyword getPTR_BCS_EAN8_SEan8_sKeyword_19_0() { return cPTR_BCS_EAN8_SEan8_sKeyword_19_0; }
+
+		//PTR_BCS_EAN13_S="ean13_s"
+		public EnumLiteralDeclaration getPTR_BCS_EAN13_SEnumLiteralDeclaration_20() { return cPTR_BCS_EAN13_SEnumLiteralDeclaration_20; }
+
+		//"ean13_s"
+		public Keyword getPTR_BCS_EAN13_SEan13_sKeyword_20_0() { return cPTR_BCS_EAN13_SEan13_sKeyword_20_0; }
+
+		//PTR_BCS_EAN128="ean128"
+		public EnumLiteralDeclaration getPTR_BCS_EAN128EnumLiteralDeclaration_21() { return cPTR_BCS_EAN128EnumLiteralDeclaration_21; }
+
+		//"ean128"
+		public Keyword getPTR_BCS_EAN128Ean128Keyword_21_0() { return cPTR_BCS_EAN128Ean128Keyword_21_0; }
+
+		//PTR_BCS_OCRA="orca"
+		public EnumLiteralDeclaration getPTR_BCS_OCRAEnumLiteralDeclaration_22() { return cPTR_BCS_OCRAEnumLiteralDeclaration_22; }
+
+		//"orca"
+		public Keyword getPTR_BCS_OCRAOrcaKeyword_22_0() { return cPTR_BCS_OCRAOrcaKeyword_22_0; }
+
+		//PTR_BCS_OCRB="ocrb"
+		public EnumLiteralDeclaration getPTR_BCS_OCRBEnumLiteralDeclaration_23() { return cPTR_BCS_OCRBEnumLiteralDeclaration_23; }
+
+		//"ocrb"
+		public Keyword getPTR_BCS_OCRBOcrbKeyword_23_0() { return cPTR_BCS_OCRBOcrbKeyword_23_0; }
+
+		//PTR_BCS_Code128_Parsed="code128_parsed"
+		public EnumLiteralDeclaration getPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24() { return cPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24; }
+
+		//"code128_parsed"
+		public Keyword getPTR_BCS_Code128_ParsedCode128_parsedKeyword_24_0() { return cPTR_BCS_Code128_ParsedCode128_parsedKeyword_24_0; }
+
+		//PTR_BCS_GS1DATABAR="gs1databar"
+		public EnumLiteralDeclaration getPTR_BCS_GS1DATABAREnumLiteralDeclaration_25() { return cPTR_BCS_GS1DATABAREnumLiteralDeclaration_25; }
+
+		//"gs1databar"
+		public Keyword getPTR_BCS_GS1DATABARGs1databarKeyword_25_0() { return cPTR_BCS_GS1DATABARGs1databarKeyword_25_0; }
+
+		//PTR_BCS_GS1DATABAR_E="gs1databar_e"
+		public EnumLiteralDeclaration getPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26() { return cPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26; }
+
+		//"gs1databar_e"
+		public Keyword getPTR_BCS_GS1DATABAR_EGs1databar_eKeyword_26_0() { return cPTR_BCS_GS1DATABAR_EGs1databar_eKeyword_26_0; }
+
+		//PTR_BCS_GS1DATABAR_S="gs1databar_s"
+		public EnumLiteralDeclaration getPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27() { return cPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27; }
+
+		//"gs1databar_s"
+		public Keyword getPTR_BCS_GS1DATABAR_SGs1databar_sKeyword_27_0() { return cPTR_BCS_GS1DATABAR_SGs1databar_sKeyword_27_0; }
+
+		//PTR_BCS_GS1DATABAR_E_S="gs1databar_e_s"
+		public EnumLiteralDeclaration getPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28() { return cPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28; }
+
+		//"gs1databar_e_s"
+		public Keyword getPTR_BCS_GS1DATABAR_E_SGs1databar_e_sKeyword_28_0() { return cPTR_BCS_GS1DATABAR_E_SGs1databar_e_sKeyword_28_0; }
+
+		//PTR_BCS_PDF417="pdf417"
+		public EnumLiteralDeclaration getPTR_BCS_PDF417EnumLiteralDeclaration_29() { return cPTR_BCS_PDF417EnumLiteralDeclaration_29; }
+
+		//"pdf417"
+		public Keyword getPTR_BCS_PDF417Pdf417Keyword_29_0() { return cPTR_BCS_PDF417Pdf417Keyword_29_0; }
+
+		//PTR_BCS_MAXICODE="maxicode"
+		public EnumLiteralDeclaration getPTR_BCS_MAXICODEEnumLiteralDeclaration_30() { return cPTR_BCS_MAXICODEEnumLiteralDeclaration_30; }
+
+		//"maxicode"
+		public Keyword getPTR_BCS_MAXICODEMaxicodeKeyword_30_0() { return cPTR_BCS_MAXICODEMaxicodeKeyword_30_0; }
+
+		//PTR_BCS_DATAMATRIX="datamatrix"
+		public EnumLiteralDeclaration getPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31() { return cPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31; }
+
+		//"datamatrix"
+		public Keyword getPTR_BCS_DATAMATRIXDatamatrixKeyword_31_0() { return cPTR_BCS_DATAMATRIXDatamatrixKeyword_31_0; }
+
+		//PTR_BCS_QRCODE="qrcode"
+		public EnumLiteralDeclaration getPTR_BCS_QRCODEEnumLiteralDeclaration_32() { return cPTR_BCS_QRCODEEnumLiteralDeclaration_32; }
+
+		//"qrcode"
+		public Keyword getPTR_BCS_QRCODEQrcodeKeyword_32_0() { return cPTR_BCS_QRCODEQrcodeKeyword_32_0; }
+
+		//PTR_BCS_UQRCODE="uqrcode"
+		public EnumLiteralDeclaration getPTR_BCS_UQRCODEEnumLiteralDeclaration_33() { return cPTR_BCS_UQRCODEEnumLiteralDeclaration_33; }
+
+		//"uqrcode"
+		public Keyword getPTR_BCS_UQRCODEUqrcodeKeyword_33_0() { return cPTR_BCS_UQRCODEUqrcodeKeyword_33_0; }
+
+		//PTR_BCS_AZTEC="aztec"
+		public EnumLiteralDeclaration getPTR_BCS_AZTECEnumLiteralDeclaration_34() { return cPTR_BCS_AZTECEnumLiteralDeclaration_34; }
+
+		//"aztec"
+		public Keyword getPTR_BCS_AZTECAztecKeyword_34_0() { return cPTR_BCS_AZTECAztecKeyword_34_0; }
+
+		//PTR_BCS_UPDF417="updf417"
+		public EnumLiteralDeclaration getPTR_BCS_UPDF417EnumLiteralDeclaration_35() { return cPTR_BCS_UPDF417EnumLiteralDeclaration_35; }
+
+		//"updf417"
+		public Keyword getPTR_BCS_UPDF417Updf417Keyword_35_0() { return cPTR_BCS_UPDF417Updf417Keyword_35_0; }
+	}
+	
+	private final StatemachineModelElements pStatemachineModel;
+	private final StatemachinePackageElements pStatemachinePackage;
+	private final StatemachineElements pStatemachine;
+	private final StatemachineEventElements pStatemachineEvent;
+	private final StatemachineStateElements pStatemachineState;
+	private final StatemachineTriggerElements pStatemachineTrigger;
+	private final StatemachineActionElements pStatemachineAction;
+	private final StatemachineActionPeripheralBlinkRateElements pStatemachineActionPeripheralBlinkRate;
+	private final StatemachineActionPeripheralClearElements pStatemachineActionPeripheralClear;
+	private final StatemachineActionPeripheralCreateWindowElements pStatemachineActionPeripheralCreateWindow;
+	private final StatemachineActionPeripheralCursorTypeElements pStatemachineActionPeripheralCursorType;
+	private final StatemachineActionPeripheralDestroyWindowElements pStatemachineActionPeripheralDestroyWindow;
+	private final StatemachineActionPeripheralDeviceBrightnessElements pStatemachineActionPeripheralDeviceBrightness;
+	private final StatemachineActionPeripheralDisplayBitmapElements pStatemachineActionPeripheralDisplayBitmap;
+	private final StatemachineActionPeripheralDisplayTextElements pStatemachineActionPeripheralDisplayText;
+	private final StatemachineActionPeripheralDisplayTextAtElements pStatemachineActionPeripheralDisplayTextAt;
+	private final StatemachineActionPeripheralInterCharacterWaitElements pStatemachineActionPeripheralInterCharacterWait;
+	private final StatemachineActionPeripheralMarqueeFormatElements pStatemachineActionPeripheralMarqueeFormat;
+	private final StatemachineActionPeripheralMarqueeRepeatWaitElements pStatemachineActionPeripheralMarqueeRepeatWait;
+	private final StatemachineActionPeripheralMarqueeTypeElements pStatemachineActionPeripheralMarqueeType;
+	private final StatemachineActionPeripheralMarqueeUnitWaitElements pStatemachineActionPeripheralMarqueeUnitWait;
+	private final StatemachineActionPeripheralScrollElements pStatemachineActionPeripheralScroll;
+	private final StatemachineActionPeripheralOpenDrawerElements pStatemachineActionPeripheralOpenDrawer;
+	private final StatemachineActionPeripheralPrintBarcodeElements pStatemachineActionPeripheralPrintBarcode;
+	private final StatemachineActionPeripheralPrintBitmapElements pStatemachineActionPeripheralPrintBitmap;
+	private final StatemachineActionPeripheralPrintCutElements pStatemachineActionPeripheralPrintCut;
+	private final StatemachineActionPeripheralPrintNormalElements pStatemachineActionPeripheralPrintNormal;
+	private final StatemachineActionPeripheralPrintRegisterBitmapElements pStatemachineActionPeripheralPrintRegisterBitmap;
+	private final StatemachineActionPeripheralPTOpenElements pStatemachineActionPeripheralPTOpen;
+	private final StatemachineActionPeripheralPTCloseElements pStatemachineActionPeripheralPTClose;
+	private final StatemachineActionPeripheralPTAcknowledgeElements pStatemachineActionPeripheralPTAcknowledge;
+	private final StatemachineActionPeripheralPTReversalElements pStatemachineActionPeripheralPTReversal;
+	private final StatemachineActionPeripheralPTRegistrationElements pStatemachineActionPeripheralPTRegistration;
+	private final StatemachineActionPeripheralPTAuthorizationElements pStatemachineActionPeripheralPTAuthorization;
+	private final StatemachineActionPeripheralPTResponseElements pStatemachineActionPeripheralPTResponse;
+	private final StatemachineActionPeripheralPrintReportElements pStatemachineActionPeripheralPrintReport;
+	private final StatemachineActionFieldSourceElements pStatemachineActionFieldSource;
+	private final StatemachineOperationElements pStatemachineOperation;
+	private final StatemachineGuardElements pStatemachineGuard;
+	private final StatemachineFunctionElements pStatemachineFunction;
+	private final StatemachineStorageElements pStatemachineStorage;
+	private final StatemachineStorageRetrieveElements pStatemachineStorageRetrieve;
+	private final StatemachineActionConditionalTransitionElements pStatemachineActionConditionalTransition;
+	private final StatemachineActionFieldSourceStringElements pStatemachineActionFieldSourceString;
+	private final StatemachineActionFieldSourceNumberElements pStatemachineActionFieldSourceNumber;
+	private final StatemachineActionFieldSourceEvaluateElements pStatemachineActionFieldSourceEvaluate;
+	private final StatemachineActionFieldSourceEventElements pStatemachineActionFieldSourceEvent;
+	private final StatemachineActionFieldSourceTranslateElements pStatemachineActionFieldSourceTranslate;
+	private final StatemachineActionFieldSourceDtoAttributeElements pStatemachineActionFieldSourceDtoAttribute;
+	private final StatemachineActionFieldSourceMoreElements pStatemachineActionFieldSourceMore;
+	private final StatemachineActionFieldSourceStringMoreElements pStatemachineActionFieldSourceStringMore;
+	private final StatemachineActionFieldSourceNumberMoreElements pStatemachineActionFieldSourceNumberMore;
+	private final StatemachineActionFieldSourceEvaluateMoreElements pStatemachineActionFieldSourceEvaluateMore;
+	private final StatemachineActionFieldSourceTranslateMoreElements pStatemachineActionFieldSourceTranslateMore;
+	private final StatemachineActionFieldGetMoreElements pStatemachineActionFieldGetMore;
+	private final StatemachineOperationMoreElements pStatemachineOperationMore;
+	private final StatemachineStorageRetrieveMoreElements pStatemachineStorageRetrieveMore;
+	private final StatemachineActionFieldSourceDtoAttributeMoreElements pStatemachineActionFieldSourceDtoAttributeMore;
+	private final StatemachineActionFieldConcatenationElements pStatemachineActionFieldConcatenation;
+	private final StatemachineOperationParameterElements pStatemachineOperationParameter;
+	private final StatemachineOperationParameterMoreElements pStatemachineOperationParameterMore;
+	private final StatemachineActionFieldSetElements pStatemachineActionFieldSet;
+	private final StatemachineActionFieldClearElements pStatemachineActionFieldClear;
+	private final StatemachineActionFieldGetElements pStatemachineActionFieldGet;
+	private final StatemachineActionFieldRemoveElements pStatemachineActionFieldRemove;
+	private final StatemachineControlVisibilityElements pStatemachineControlVisibility;
+	private final StatemachineActionItemVisibleElements pStatemachineActionItemVisible;
+	private final StatemachineActionItemInvisibleElements pStatemachineActionItemInvisible;
+	private final StatemachineActionButtonCaptionElements pStatemachineActionButtonCaption;
+	private final StatemachineActionButtonImageElements pStatemachineActionButtonImage;
+	private final StatemachineActionDTOFindElements pStatemachineActionDTOFind;
+	private final StatemachineActionSchedulerElements pStatemachineActionScheduler;
+	private final StatemachineControlElements pStatemachineControl;
+	private final StatemachineControlButtonElements pStatemachineControlButton;
+	private final StatemachineControlFieldElements pStatemachineControlField;
+	private final StatemachineControlDTOElements pStatemachineControlDTO;
+	private final StatemachineControlSchedulerElements pStatemachineControlScheduler;
+	private final StatemachinePeripheralDeviceLineDisplayElements pStatemachinePeripheralDeviceLineDisplay;
+	private final StatemachinePeripheralDevicePOSPrinterElements pStatemachinePeripheralDevicePOSPrinter;
+	private final StatemachinePeripheralDeviceCashDrawerElements pStatemachinePeripheralDeviceCashDrawer;
+	private final StatemachinePeripheralDevicePTElements pStatemachinePeripheralDevicePT;
+	private final StatemachineControlPeripheralElements pStatemachineControlPeripheral;
+	private final StatemachineControlButtonAttributeElements pStatemachineControlButtonAttribute;
+	private final StatemachineControlButtonAttributeEventElements pStatemachineControlButtonAttributeEvent;
+	private final StatemachineControlButtonAttributeEventKeyboardElements pStatemachineControlButtonAttributeEventKeyboard;
+	private final StatemachineControlButtonAttributeEventIdentityElements pStatemachineControlButtonAttributeEventIdentity;
+	private final StatemachineControlButtonAttributeEventEventElements pStatemachineControlButtonAttributeEventEvent;
+	private final StatemachineControlFieldAttributeElements pStatemachineControlFieldAttribute;
+	private final StatemachineControlFieldLayoutElements pStatemachineControlFieldLayout;
+	private final StatemachineControlDTOAttributeElements pStatemachineControlDTOAttribute;
+	private final StatemachineControlSchedulerAttributeElements pStatemachineControlSchedulerAttribute;
+	private final StatemachineDTOTypeElements pStatemachineDTOType;
+	private final StatemachineFieldTypeElements pStatemachineFieldType;
+	private final StatemachineInternalTypeElements unknownRuleStatemachineInternalType;
+	private final StatemachineControlButtonEventTypeElements unknownRuleStatemachineControlButtonEventType;
+	private final StatemachineEvaluationTypeElements unknownRuleStatemachineEvaluationType;
+	private final StatemachineUserMessageTypeElements unknownRuleStatemachineUserMessageType;
+	private final StatemachineLineDisplayCursorTypeElements unknownRuleStatemachineLineDisplayCursorType;
+	private final StatemachineLineDisplayMarqueeTypeElements unknownRuleStatemachineLineDisplayMarqueeType;
+	private final StatemachineLineDisplayMarqueeFormatElements unknownRuleStatemachineLineDisplayMarqueeFormat;
+	private final StatemachineLineDisplayTextTypeElements unknownRuleStatemachineLineDisplayTextType;
+	private final StatemachineLineDisplayScrollTextTypeElements unknownRuleStatemachineLineDisplayScrollTextType;
+	private final StatemachinePOSPrinterBarcodeTypeElements unknownRuleStatemachinePOSPrinterBarcodeType;
+	private final StatemachineImportElements pStatemachineImport;
+	private final StatemachineQualifiedNameWithWildCardElements pStatemachineQualifiedNameWithWildCard;
+	private final QualifiedNameElements pQualifiedName;
+	private final ValidIDElements pValidID;
+	private final TRANSLATABLESTRINGElements pTRANSLATABLESTRING;
+	private final TRANSLATABLEIDElements pTRANSLATABLEID;
+	private final SignedNumberElements pSignedNumber;
+	private final UnsignedNumberElements pUnsignedNumber;
+	
+	private final Grammar grammar;
+
+	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
+
+	@Inject
+	public StatemachineDSLGrammarAccess(GrammarProvider grammarProvider,
+		XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations) {
+		this.grammar = internalFindGrammar(grammarProvider);
+		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
+		this.pStatemachineModel = new StatemachineModelElements();
+		this.pStatemachinePackage = new StatemachinePackageElements();
+		this.pStatemachine = new StatemachineElements();
+		this.pStatemachineEvent = new StatemachineEventElements();
+		this.pStatemachineState = new StatemachineStateElements();
+		this.pStatemachineTrigger = new StatemachineTriggerElements();
+		this.pStatemachineAction = new StatemachineActionElements();
+		this.pStatemachineActionPeripheralBlinkRate = new StatemachineActionPeripheralBlinkRateElements();
+		this.pStatemachineActionPeripheralClear = new StatemachineActionPeripheralClearElements();
+		this.pStatemachineActionPeripheralCreateWindow = new StatemachineActionPeripheralCreateWindowElements();
+		this.pStatemachineActionPeripheralCursorType = new StatemachineActionPeripheralCursorTypeElements();
+		this.pStatemachineActionPeripheralDestroyWindow = new StatemachineActionPeripheralDestroyWindowElements();
+		this.pStatemachineActionPeripheralDeviceBrightness = new StatemachineActionPeripheralDeviceBrightnessElements();
+		this.pStatemachineActionPeripheralDisplayBitmap = new StatemachineActionPeripheralDisplayBitmapElements();
+		this.pStatemachineActionPeripheralDisplayText = new StatemachineActionPeripheralDisplayTextElements();
+		this.pStatemachineActionPeripheralDisplayTextAt = new StatemachineActionPeripheralDisplayTextAtElements();
+		this.pStatemachineActionPeripheralInterCharacterWait = new StatemachineActionPeripheralInterCharacterWaitElements();
+		this.pStatemachineActionPeripheralMarqueeFormat = new StatemachineActionPeripheralMarqueeFormatElements();
+		this.pStatemachineActionPeripheralMarqueeRepeatWait = new StatemachineActionPeripheralMarqueeRepeatWaitElements();
+		this.pStatemachineActionPeripheralMarqueeType = new StatemachineActionPeripheralMarqueeTypeElements();
+		this.pStatemachineActionPeripheralMarqueeUnitWait = new StatemachineActionPeripheralMarqueeUnitWaitElements();
+		this.pStatemachineActionPeripheralScroll = new StatemachineActionPeripheralScrollElements();
+		this.pStatemachineActionPeripheralOpenDrawer = new StatemachineActionPeripheralOpenDrawerElements();
+		this.pStatemachineActionPeripheralPrintBarcode = new StatemachineActionPeripheralPrintBarcodeElements();
+		this.pStatemachineActionPeripheralPrintBitmap = new StatemachineActionPeripheralPrintBitmapElements();
+		this.pStatemachineActionPeripheralPrintCut = new StatemachineActionPeripheralPrintCutElements();
+		this.pStatemachineActionPeripheralPrintNormal = new StatemachineActionPeripheralPrintNormalElements();
+		this.pStatemachineActionPeripheralPrintRegisterBitmap = new StatemachineActionPeripheralPrintRegisterBitmapElements();
+		this.pStatemachineActionPeripheralPTOpen = new StatemachineActionPeripheralPTOpenElements();
+		this.pStatemachineActionPeripheralPTClose = new StatemachineActionPeripheralPTCloseElements();
+		this.pStatemachineActionPeripheralPTAcknowledge = new StatemachineActionPeripheralPTAcknowledgeElements();
+		this.pStatemachineActionPeripheralPTReversal = new StatemachineActionPeripheralPTReversalElements();
+		this.pStatemachineActionPeripheralPTRegistration = new StatemachineActionPeripheralPTRegistrationElements();
+		this.pStatemachineActionPeripheralPTAuthorization = new StatemachineActionPeripheralPTAuthorizationElements();
+		this.pStatemachineActionPeripheralPTResponse = new StatemachineActionPeripheralPTResponseElements();
+		this.pStatemachineActionPeripheralPrintReport = new StatemachineActionPeripheralPrintReportElements();
+		this.pStatemachineActionFieldSource = new StatemachineActionFieldSourceElements();
+		this.pStatemachineOperation = new StatemachineOperationElements();
+		this.pStatemachineGuard = new StatemachineGuardElements();
+		this.pStatemachineFunction = new StatemachineFunctionElements();
+		this.pStatemachineStorage = new StatemachineStorageElements();
+		this.pStatemachineStorageRetrieve = new StatemachineStorageRetrieveElements();
+		this.pStatemachineActionConditionalTransition = new StatemachineActionConditionalTransitionElements();
+		this.pStatemachineActionFieldSourceString = new StatemachineActionFieldSourceStringElements();
+		this.pStatemachineActionFieldSourceNumber = new StatemachineActionFieldSourceNumberElements();
+		this.pStatemachineActionFieldSourceEvaluate = new StatemachineActionFieldSourceEvaluateElements();
+		this.pStatemachineActionFieldSourceEvent = new StatemachineActionFieldSourceEventElements();
+		this.pStatemachineActionFieldSourceTranslate = new StatemachineActionFieldSourceTranslateElements();
+		this.pStatemachineActionFieldSourceDtoAttribute = new StatemachineActionFieldSourceDtoAttributeElements();
+		this.pStatemachineActionFieldSourceMore = new StatemachineActionFieldSourceMoreElements();
+		this.pStatemachineActionFieldSourceStringMore = new StatemachineActionFieldSourceStringMoreElements();
+		this.pStatemachineActionFieldSourceNumberMore = new StatemachineActionFieldSourceNumberMoreElements();
+		this.pStatemachineActionFieldSourceEvaluateMore = new StatemachineActionFieldSourceEvaluateMoreElements();
+		this.pStatemachineActionFieldSourceTranslateMore = new StatemachineActionFieldSourceTranslateMoreElements();
+		this.pStatemachineActionFieldGetMore = new StatemachineActionFieldGetMoreElements();
+		this.pStatemachineOperationMore = new StatemachineOperationMoreElements();
+		this.pStatemachineStorageRetrieveMore = new StatemachineStorageRetrieveMoreElements();
+		this.pStatemachineActionFieldSourceDtoAttributeMore = new StatemachineActionFieldSourceDtoAttributeMoreElements();
+		this.pStatemachineActionFieldConcatenation = new StatemachineActionFieldConcatenationElements();
+		this.pStatemachineOperationParameter = new StatemachineOperationParameterElements();
+		this.pStatemachineOperationParameterMore = new StatemachineOperationParameterMoreElements();
+		this.pStatemachineActionFieldSet = new StatemachineActionFieldSetElements();
+		this.pStatemachineActionFieldClear = new StatemachineActionFieldClearElements();
+		this.pStatemachineActionFieldGet = new StatemachineActionFieldGetElements();
+		this.pStatemachineActionFieldRemove = new StatemachineActionFieldRemoveElements();
+		this.pStatemachineControlVisibility = new StatemachineControlVisibilityElements();
+		this.pStatemachineActionItemVisible = new StatemachineActionItemVisibleElements();
+		this.pStatemachineActionItemInvisible = new StatemachineActionItemInvisibleElements();
+		this.pStatemachineActionButtonCaption = new StatemachineActionButtonCaptionElements();
+		this.pStatemachineActionButtonImage = new StatemachineActionButtonImageElements();
+		this.pStatemachineActionDTOFind = new StatemachineActionDTOFindElements();
+		this.pStatemachineActionScheduler = new StatemachineActionSchedulerElements();
+		this.pStatemachineControl = new StatemachineControlElements();
+		this.pStatemachineControlButton = new StatemachineControlButtonElements();
+		this.pStatemachineControlField = new StatemachineControlFieldElements();
+		this.pStatemachineControlDTO = new StatemachineControlDTOElements();
+		this.pStatemachineControlScheduler = new StatemachineControlSchedulerElements();
+		this.pStatemachinePeripheralDeviceLineDisplay = new StatemachinePeripheralDeviceLineDisplayElements();
+		this.pStatemachinePeripheralDevicePOSPrinter = new StatemachinePeripheralDevicePOSPrinterElements();
+		this.pStatemachinePeripheralDeviceCashDrawer = new StatemachinePeripheralDeviceCashDrawerElements();
+		this.pStatemachinePeripheralDevicePT = new StatemachinePeripheralDevicePTElements();
+		this.pStatemachineControlPeripheral = new StatemachineControlPeripheralElements();
+		this.pStatemachineControlButtonAttribute = new StatemachineControlButtonAttributeElements();
+		this.pStatemachineControlButtonAttributeEvent = new StatemachineControlButtonAttributeEventElements();
+		this.pStatemachineControlButtonAttributeEventKeyboard = new StatemachineControlButtonAttributeEventKeyboardElements();
+		this.pStatemachineControlButtonAttributeEventIdentity = new StatemachineControlButtonAttributeEventIdentityElements();
+		this.pStatemachineControlButtonAttributeEventEvent = new StatemachineControlButtonAttributeEventEventElements();
+		this.pStatemachineControlFieldAttribute = new StatemachineControlFieldAttributeElements();
+		this.pStatemachineControlFieldLayout = new StatemachineControlFieldLayoutElements();
+		this.pStatemachineControlDTOAttribute = new StatemachineControlDTOAttributeElements();
+		this.pStatemachineControlSchedulerAttribute = new StatemachineControlSchedulerAttributeElements();
+		this.pStatemachineDTOType = new StatemachineDTOTypeElements();
+		this.pStatemachineFieldType = new StatemachineFieldTypeElements();
+		this.unknownRuleStatemachineInternalType = new StatemachineInternalTypeElements();
+		this.unknownRuleStatemachineControlButtonEventType = new StatemachineControlButtonEventTypeElements();
+		this.unknownRuleStatemachineEvaluationType = new StatemachineEvaluationTypeElements();
+		this.unknownRuleStatemachineUserMessageType = new StatemachineUserMessageTypeElements();
+		this.unknownRuleStatemachineLineDisplayCursorType = new StatemachineLineDisplayCursorTypeElements();
+		this.unknownRuleStatemachineLineDisplayMarqueeType = new StatemachineLineDisplayMarqueeTypeElements();
+		this.unknownRuleStatemachineLineDisplayMarqueeFormat = new StatemachineLineDisplayMarqueeFormatElements();
+		this.unknownRuleStatemachineLineDisplayTextType = new StatemachineLineDisplayTextTypeElements();
+		this.unknownRuleStatemachineLineDisplayScrollTextType = new StatemachineLineDisplayScrollTextTypeElements();
+		this.unknownRuleStatemachinePOSPrinterBarcodeType = new StatemachinePOSPrinterBarcodeTypeElements();
+		this.pStatemachineImport = new StatemachineImportElements();
+		this.pStatemachineQualifiedNameWithWildCard = new StatemachineQualifiedNameWithWildCardElements();
+		this.pQualifiedName = new QualifiedNameElements();
+		this.pValidID = new ValidIDElements();
+		this.pTRANSLATABLESTRING = new TRANSLATABLESTRINGElements();
+		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
+		this.pSignedNumber = new SignedNumberElements();
+		this.pUnsignedNumber = new UnsignedNumberElements();
+	}
+	
+	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
+		Grammar grammar = grammarProvider.getGrammar(this);
+		while (grammar != null) {
+			if ("org.eclipse.osbp.xtext.statemachine.StatemachineDSL".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 XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
+		return gaXbaseWithAnnotations;
+	}
+
+	
+	//StatemachineModel:
+	//	packages+=StatemachinePackage*;
+	public StatemachineModelElements getStatemachineModelAccess() {
+		return pStatemachineModel;
+	}
+	
+	public ParserRule getStatemachineModelRule() {
+		return getStatemachineModelAccess().getRule();
+	}
+
+	//StatemachinePackage:
+	//	{StatemachinePackage} "package" name=QualifiedName ("{" imports+=StatemachineImport* statemachines+=Statemachine*
+	//	"}")?;
+	public StatemachinePackageElements getStatemachinePackageAccess() {
+		return pStatemachinePackage;
+	}
+	
+	public ParserRule getStatemachinePackageRule() {
+		return getStatemachinePackageAccess().getRule();
+	}
+
+	//Statemachine:
+	//	"statemachine" name=ID (description?="described by" descriptionValue=TRANSLATABLESTRING)? ("functiongroup"
+	//	functionGroup=[function::FunctionLibraryStatemachineGroup])? "initialState" initialState=[StatemachineState]
+	//	"initialEvent" initialEvent=[StatemachineEvent] ("events" ("{" events+=StatemachineEvent* "}")) ("controls" "{"
+	//	controls+=StatemachineControl* "}") ("states" "{" states+=StatemachineState* "}");
+	public StatemachineElements getStatemachineAccess() {
+		return pStatemachine;
+	}
+	
+	public ParserRule getStatemachineRule() {
+		return getStatemachineAccess().getRule();
+	}
+
+	//StatemachineEvent:
+	//	"event" name=ID;
+	public StatemachineEventElements getStatemachineEventAccess() {
+		return pStatemachineEvent;
+	}
+	
+	public ParserRule getStatemachineEventRule() {
+		return getStatemachineEventAccess().getRule();
+	}
+
+	//StatemachineState:
+	//	"state" name=ID "{" (("triggers" "{" triggers+=StatemachineTrigger* "}")? & ("identity"
+	//	identity=StatemachineOperation)? & ("keystroke" "@" keystroke=[StatemachineControlFieldAttribute]
+	//	(hasKeyOperation?="and" keyOperation=StatemachineOperation)?)?) "}";
+	public StatemachineStateElements getStatemachineStateAccess() {
+		return pStatemachineState;
+	}
+	
+	public ParserRule getStatemachineStateRule() {
+		return getStatemachineStateAccess().getRule();
+	}
+
+	//StatemachineTrigger:
+	//	{StatemachineTrigger} "trigger" triggers+=[StatemachineEvent]* ("guards" "{" guards+=StatemachineGuard* "}")?
+	//	"actions" (hasTransition?="transition" transition=[StatemachineState])? "{" actions+=StatemachineAction* "}";
+	public StatemachineTriggerElements getStatemachineTriggerAccess() {
+		return pStatemachineTrigger;
+	}
+	
+	public ParserRule getStatemachineTriggerRule() {
+		return getStatemachineTriggerAccess().getRule();
+	}
+
+	//StatemachineAction:
+	//	StatemachineActionPeripheralBlinkRate | StatemachineActionPeripheralClear | StatemachineActionPeripheralCreateWindow
+	//	| StatemachineActionPeripheralCursorType | StatemachineActionPeripheralDestroyWindow |
+	//	StatemachineActionPeripheralDeviceBrightness | StatemachineActionPeripheralDisplayBitmap |
+	//	StatemachineActionPeripheralDisplayText | StatemachineActionPeripheralDisplayTextAt |
+	//	StatemachineActionPeripheralInterCharacterWait | StatemachineActionPeripheralMarqueeFormat |
+	//	StatemachineActionPeripheralMarqueeRepeatWait | StatemachineActionPeripheralMarqueeType |
+	//	StatemachineActionPeripheralMarqueeUnitWait | StatemachineActionPeripheralScroll |
+	//	StatemachineActionPeripheralOpenDrawer | StatemachineActionPeripheralPrintBarcode |
+	//	StatemachineActionPeripheralPrintBitmap | StatemachineActionPeripheralPrintCut |
+	//	StatemachineActionPeripheralPrintNormal | StatemachineActionPeripheralPrintRegisterBitmap |
+	//	StatemachineActionPeripheralPTOpen | StatemachineActionPeripheralPTClose | StatemachineActionPeripheralPTAcknowledge
+	//	| //	StatemachineActionPeripheralPTPrepaidTopUp|
+	//	StatemachineActionPeripheralPTReversal | StatemachineActionPeripheralPTRegistration |
+	//	StatemachineActionPeripheralPTAuthorization | StatemachineActionPeripheralPrintReport | StatemachineActionFieldSet |
+	//	StatemachineActionFieldRemove | StatemachineActionItemVisible | StatemachineActionItemInvisible |
+	//	StatemachineActionFieldClear | StatemachineActionButtonCaption | StatemachineActionButtonImage |
+	//	StatemachineActionDTOFind | StatemachineStorage | StatemachineActionScheduler | StatemachineOperation |
+	//	StatemachineActionConditionalTransition;
+	public StatemachineActionElements getStatemachineActionAccess() {
+		return pStatemachineAction;
+	}
+	
+	public ParserRule getStatemachineActionRule() {
+		return getStatemachineActionAccess().getRule();
+	}
+
+	//// peripherals
+	////lineDisplay
+	//StatemachineActionPeripheralBlinkRate:
+	//	"blinkRate" blinkRate=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralBlinkRateElements getStatemachineActionPeripheralBlinkRateAccess() {
+		return pStatemachineActionPeripheralBlinkRate;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralBlinkRateRule() {
+		return getStatemachineActionPeripheralBlinkRateAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralClear:
+	//	"clearDevice" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralClearElements getStatemachineActionPeripheralClearAccess() {
+		return pStatemachineActionPeripheralClear;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralClearRule() {
+		return getStatemachineActionPeripheralClearAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralCreateWindow:
+	//	"createWindow" "row" viewportRow=INT "column" viewportColumn=INT "height" viewportHeight=INT "width"
+	//	viewportWidth=INT "windowHeight" windowHeight=INT "windowWidth" windowWidth=INT "@"
+	//	device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralCreateWindowElements getStatemachineActionPeripheralCreateWindowAccess() {
+		return pStatemachineActionPeripheralCreateWindow;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralCreateWindowRule() {
+		return getStatemachineActionPeripheralCreateWindowAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralCursorType:
+	//	"cursorType" cursorType=StatemachineLineDisplayCursorType "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralCursorTypeElements getStatemachineActionPeripheralCursorTypeAccess() {
+		return pStatemachineActionPeripheralCursorType;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralCursorTypeRule() {
+		return getStatemachineActionPeripheralCursorTypeAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralDestroyWindow:
+	//	"destroyWindow" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralDestroyWindowElements getStatemachineActionPeripheralDestroyWindowAccess() {
+		return pStatemachineActionPeripheralDestroyWindow;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralDestroyWindowRule() {
+		return getStatemachineActionPeripheralDestroyWindowAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralDeviceBrightness:
+	//	"deviceBrightness" brightness=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralDeviceBrightnessElements getStatemachineActionPeripheralDeviceBrightnessAccess() {
+		return pStatemachineActionPeripheralDeviceBrightness;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralDeviceBrightnessRule() {
+		return getStatemachineActionPeripheralDeviceBrightnessAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralDisplayBitmap:
+	//	"displayBitmap" "id" bitmapId=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralDisplayBitmapElements getStatemachineActionPeripheralDisplayBitmapAccess() {
+		return pStatemachineActionPeripheralDisplayBitmap;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralDisplayBitmapRule() {
+		return getStatemachineActionPeripheralDisplayBitmapAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralDisplayText:
+	//	"displayText" "text" text=StatemachineActionFieldConcatenation (hasType?="type"
+	//	textType=StatemachineLineDisplayTextType)? "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralDisplayTextElements getStatemachineActionPeripheralDisplayTextAccess() {
+		return pStatemachineActionPeripheralDisplayText;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralDisplayTextRule() {
+		return getStatemachineActionPeripheralDisplayTextAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralDisplayTextAt:
+	//	"displayTextAt" "text" text=StatemachineActionFieldConcatenation "row" row=INT "column" column=INT (hasType?="type"
+	//	textType=StatemachineLineDisplayTextType)? "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralDisplayTextAtElements getStatemachineActionPeripheralDisplayTextAtAccess() {
+		return pStatemachineActionPeripheralDisplayTextAt;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralDisplayTextAtRule() {
+		return getStatemachineActionPeripheralDisplayTextAtAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralInterCharacterWait:
+	//	"interCharacterWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralInterCharacterWaitElements getStatemachineActionPeripheralInterCharacterWaitAccess() {
+		return pStatemachineActionPeripheralInterCharacterWait;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralInterCharacterWaitRule() {
+		return getStatemachineActionPeripheralInterCharacterWaitAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralMarqueeFormat:
+	//	"marqueeFormat" format=StatemachineLineDisplayMarqueeFormat "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralMarqueeFormatElements getStatemachineActionPeripheralMarqueeFormatAccess() {
+		return pStatemachineActionPeripheralMarqueeFormat;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralMarqueeFormatRule() {
+		return getStatemachineActionPeripheralMarqueeFormatAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralMarqueeRepeatWait:
+	//	"marqueeRepeatWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralMarqueeRepeatWaitElements getStatemachineActionPeripheralMarqueeRepeatWaitAccess() {
+		return pStatemachineActionPeripheralMarqueeRepeatWait;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralMarqueeRepeatWaitRule() {
+		return getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralMarqueeType:
+	//	"marqueeType" marqueeType=StatemachineLineDisplayMarqueeType "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralMarqueeTypeElements getStatemachineActionPeripheralMarqueeTypeAccess() {
+		return pStatemachineActionPeripheralMarqueeType;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralMarqueeTypeRule() {
+		return getStatemachineActionPeripheralMarqueeTypeAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralMarqueeUnitWait:
+	//	"marqueeUnitWait" wait=INT "@" device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralMarqueeUnitWaitElements getStatemachineActionPeripheralMarqueeUnitWaitAccess() {
+		return pStatemachineActionPeripheralMarqueeUnitWait;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralMarqueeUnitWaitRule() {
+		return getStatemachineActionPeripheralMarqueeUnitWaitAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralScroll:
+	//	"scroll" direction=StatemachineLineDisplayScrollTextType units=INT "@"
+	//	device=[StatemachinePeripheralDeviceLineDisplay];
+	public StatemachineActionPeripheralScrollElements getStatemachineActionPeripheralScrollAccess() {
+		return pStatemachineActionPeripheralScroll;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralScrollRule() {
+		return getStatemachineActionPeripheralScrollAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralOpenDrawer:
+	//	"openDrawer" device=[StatemachinePeripheralDeviceCashDrawer];
+	public StatemachineActionPeripheralOpenDrawerElements getStatemachineActionPeripheralOpenDrawerAccess() {
+		return pStatemachineActionPeripheralOpenDrawer;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralOpenDrawerRule() {
+		return getStatemachineActionPeripheralOpenDrawerAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPrintBarcode:
+	//	"printBarcode" "data" data=STRING "barcodeType" barcodeType=StatemachinePOSPrinterBarcodeType "@"
+	//	device=[StatemachinePeripheralDevicePOSPrinter];
+	public StatemachineActionPeripheralPrintBarcodeElements getStatemachineActionPeripheralPrintBarcodeAccess() {
+		return pStatemachineActionPeripheralPrintBarcode;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPrintBarcodeRule() {
+		return getStatemachineActionPeripheralPrintBarcodeAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPrintBitmap:
+	//	"printBitmap" "id" bitmapId=INT "@" device=[StatemachinePeripheralDevicePOSPrinter];
+	public StatemachineActionPeripheralPrintBitmapElements getStatemachineActionPeripheralPrintBitmapAccess() {
+		return pStatemachineActionPeripheralPrintBitmap;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPrintBitmapRule() {
+		return getStatemachineActionPeripheralPrintBitmapAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPrintCut:
+	//	"printCut" "text" text=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePOSPrinter];
+	public StatemachineActionPeripheralPrintCutElements getStatemachineActionPeripheralPrintCutAccess() {
+		return pStatemachineActionPeripheralPrintCut;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPrintCutRule() {
+		return getStatemachineActionPeripheralPrintCutAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPrintNormal:
+	//	"printNormal" "text" text=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePOSPrinter];
+	public StatemachineActionPeripheralPrintNormalElements getStatemachineActionPeripheralPrintNormalAccess() {
+		return pStatemachineActionPeripheralPrintNormal;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPrintNormalRule() {
+		return getStatemachineActionPeripheralPrintNormalAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPrintRegisterBitmap:
+	//	"registerBitmap" "id" bitmapId=INT "name" name=STRING "@" device=[StatemachinePeripheralDevicePOSPrinter];
+	public StatemachineActionPeripheralPrintRegisterBitmapElements getStatemachineActionPeripheralPrintRegisterBitmapAccess() {
+		return pStatemachineActionPeripheralPrintRegisterBitmap;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPrintRegisterBitmapRule() {
+		return getStatemachineActionPeripheralPrintRegisterBitmapAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPTOpen:
+	//	"paymentOpen" "host" host=StatemachineActionFieldConcatenation "port" port=StatemachineActionFieldConcatenation "@"
+	//	device=[StatemachinePeripheralDevicePT];
+	public StatemachineActionPeripheralPTOpenElements getStatemachineActionPeripheralPTOpenAccess() {
+		return pStatemachineActionPeripheralPTOpen;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPTOpenRule() {
+		return getStatemachineActionPeripheralPTOpenAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPTClose:
+	//	"paymentClose" "@" device=[StatemachinePeripheralDevicePT];
+	public StatemachineActionPeripheralPTCloseElements getStatemachineActionPeripheralPTCloseAccess() {
+		return pStatemachineActionPeripheralPTClose;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPTCloseRule() {
+		return getStatemachineActionPeripheralPTCloseAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPTAcknowledge:
+	//	"paymentAcknowledge" "@" device=[StatemachinePeripheralDevicePT];
+	public StatemachineActionPeripheralPTAcknowledgeElements getStatemachineActionPeripheralPTAcknowledgeAccess() {
+		return pStatemachineActionPeripheralPTAcknowledge;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPTAcknowledgeRule() {
+		return getStatemachineActionPeripheralPTAcknowledgeAccess().getRule();
+	}
+
+	////StatemachineActionPeripheralPTBalanceRequest:
+	////	'balanceRequest' '@' device=[StatemachinePeripheralDevicePT];
+	////StatemachineActionPeripheralPTPrepaidTopUp:
+	////	'prepaidTopUp' 'of' source=StatemachineActionFieldConcatenation '@' device=[StatemachinePeripheralDevicePT];
+	//StatemachineActionPeripheralPTReversal:
+	//	"paymentReversal" "withPassword" password=StatemachineActionFieldConcatenation "ofReceipt"
+	//	receipt=StatemachineActionFieldConcatenation "@" device=[StatemachinePeripheralDevicePT];
+	public StatemachineActionPeripheralPTReversalElements getStatemachineActionPeripheralPTReversalAccess() {
+		return pStatemachineActionPeripheralPTReversal;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPTReversalRule() {
+		return getStatemachineActionPeripheralPTReversalAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPTRegistration:
+	//	"paymentRegistration" "withPassword" password=StatemachineActionFieldConcatenation "configuration"
+	//	configuration=STRING "@" device=[StatemachinePeripheralDevicePT];
+	public StatemachineActionPeripheralPTRegistrationElements getStatemachineActionPeripheralPTRegistrationAccess() {
+		return pStatemachineActionPeripheralPTRegistration;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPTRegistrationRule() {
+		return getStatemachineActionPeripheralPTRegistrationAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPTAuthorization:
+	//	"paymentAuthorization" "ofAmount" amount=StatemachineActionFieldConcatenation "@"
+	//	device=[StatemachinePeripheralDevicePT];
+	public StatemachineActionPeripheralPTAuthorizationElements getStatemachineActionPeripheralPTAuthorizationAccess() {
+		return pStatemachineActionPeripheralPTAuthorization;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPTAuthorizationRule() {
+		return getStatemachineActionPeripheralPTAuthorizationAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPTResponse:
+	//	"paymentResponse" "from" device=[StatemachinePeripheralDevicePT];
+	public StatemachineActionPeripheralPTResponseElements getStatemachineActionPeripheralPTResponseAccess() {
+		return pStatemachineActionPeripheralPTResponse;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPTResponseRule() {
+		return getStatemachineActionPeripheralPTResponseAccess().getRule();
+	}
+
+	//StatemachineActionPeripheralPrintReport:
+	//	"printReport" report=[report::Report] (hasFilter?="from" key=[StatemachineStorage])?;
+	public StatemachineActionPeripheralPrintReportElements getStatemachineActionPeripheralPrintReportAccess() {
+		return pStatemachineActionPeripheralPrintReport;
+	}
+	
+	public ParserRule getStatemachineActionPeripheralPrintReportRule() {
+		return getStatemachineActionPeripheralPrintReportAccess().getRule();
+	}
+
+	//// fields
+	//StatemachineActionFieldSource:
+	//	StatemachineActionFieldSourceString | StatemachineActionFieldSourceNumber | StatemachineActionFieldSourceEvaluate |
+	//	StatemachineActionFieldSourceTranslate | StatemachineActionFieldGet | StatemachineFunction |
+	//	StatemachineStorageRetrieve | StatemachineActionFieldSourceDtoAttribute | StatemachineActionFieldSourceEvent |
+	//	StatemachineActionPeripheralPTResponse;
+	public StatemachineActionFieldSourceElements getStatemachineActionFieldSourceAccess() {
+		return pStatemachineActionFieldSource;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceRule() {
+		return getStatemachineActionFieldSourceAccess().getRule();
+	}
+
+	//StatemachineOperation:
+	//	"operation" operation=[function::FunctionLibraryOperation] "(" first=StatemachineOperationParameter?
+	//	more+=StatemachineOperationParameterMore* ")";
+	public StatemachineOperationElements getStatemachineOperationAccess() {
+		return pStatemachineOperation;
+	}
+	
+	public ParserRule getStatemachineOperationRule() {
+		return getStatemachineOperationAccess().getRule();
+	}
+
+	//StatemachineGuard:
+	//	"guard" guard=[function::FunctionLibraryGuard] (hasOnFail?="onFail" "caption" onFailCaption=TRANSLATABLESTRING
+	//	"description" onFailDescription=TRANSLATABLESTRING "type" onFailType=StatemachineUserMessageType)?;
+	public StatemachineGuardElements getStatemachineGuardAccess() {
+		return pStatemachineGuard;
+	}
+	
+	public ParserRule getStatemachineGuardRule() {
+		return getStatemachineGuardAccess().getRule();
+	}
+
+	//StatemachineFunction:
+	//	"function" function=[function::FunctionLibraryFunction] "(" first=StatemachineOperationParameter?
+	//	more+=StatemachineOperationParameterMore* ")";
+	public StatemachineFunctionElements getStatemachineFunctionAccess() {
+		return pStatemachineFunction;
+	}
+	
+	public ParserRule getStatemachineFunctionRule() {
+		return getStatemachineFunctionAccess().getRule();
+	}
+
+	//StatemachineStorage:
+	//	"store" content=StatemachineActionFieldConcatenation "with" key=ID "." attribute=ID;
+	public StatemachineStorageElements getStatemachineStorageAccess() {
+		return pStatemachineStorage;
+	}
+	
+	public ParserRule getStatemachineStorageRule() {
+		return getStatemachineStorageAccess().getRule();
+	}
+
+	//StatemachineStorageRetrieve:
+	//	"retrieve" "from" key=ID "." attribute=ID;
+	public StatemachineStorageRetrieveElements getStatemachineStorageRetrieveAccess() {
+		return pStatemachineStorageRetrieve;
+	}
+	
+	public ParserRule getStatemachineStorageRetrieveRule() {
+		return getStatemachineStorageRetrieveAccess().getRule();
+	}
+
+	//StatemachineActionConditionalTransition:
+	//	"transition" transition=[StatemachineState] guard=StatemachineGuard "{" actions+=StatemachineAction* "}";
+	public StatemachineActionConditionalTransitionElements getStatemachineActionConditionalTransitionAccess() {
+		return pStatemachineActionConditionalTransition;
+	}
+	
+	public ParserRule getStatemachineActionConditionalTransitionRule() {
+		return getStatemachineActionConditionalTransitionAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceString:
+	//	text=STRING;
+	public StatemachineActionFieldSourceStringElements getStatemachineActionFieldSourceStringAccess() {
+		return pStatemachineActionFieldSourceString;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceStringRule() {
+		return getStatemachineActionFieldSourceStringAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceNumber:
+	//	value=SignedNumber;
+	public StatemachineActionFieldSourceNumberElements getStatemachineActionFieldSourceNumberAccess() {
+		return pStatemachineActionFieldSourceNumber;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceNumberRule() {
+		return getStatemachineActionFieldSourceNumberAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceEvaluate:
+	//	evaluationtype=StatemachineEvaluationType;
+	public StatemachineActionFieldSourceEvaluateElements getStatemachineActionFieldSourceEvaluateAccess() {
+		return pStatemachineActionFieldSourceEvaluate;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceEvaluateRule() {
+		return getStatemachineActionFieldSourceEvaluateAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceEvent:
+	//	{StatemachineActionFieldSourceEvent} "event";
+	public StatemachineActionFieldSourceEventElements getStatemachineActionFieldSourceEventAccess() {
+		return pStatemachineActionFieldSourceEvent;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceEventRule() {
+		return getStatemachineActionFieldSourceEventAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceTranslate:
+	//	"translate" text=TRANSLATABLESTRING;
+	public StatemachineActionFieldSourceTranslateElements getStatemachineActionFieldSourceTranslateAccess() {
+		return pStatemachineActionFieldSourceTranslate;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceTranslateRule() {
+		return getStatemachineActionFieldSourceTranslateAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceDtoAttribute:
+	//	"dto" dto=[StatemachineControlDTOAttribute] "." attribute=[dto::LDtoInheritedAttribute];
+	public StatemachineActionFieldSourceDtoAttributeElements getStatemachineActionFieldSourceDtoAttributeAccess() {
+		return pStatemachineActionFieldSourceDtoAttribute;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceDtoAttributeRule() {
+		return getStatemachineActionFieldSourceDtoAttributeAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceMore returns StatemachineActionFieldSource:
+	//	StatemachineActionFieldSourceStringMore | StatemachineActionFieldSourceNumberMore |
+	//	StatemachineActionFieldSourceEvaluateMore | StatemachineActionFieldSourceTranslateMore |
+	//	StatemachineActionFieldGetMore | StatemachineOperationMore | StatemachineStorageRetrieveMore |
+	//	StatemachineActionFieldSourceDtoAttributeMore;
+	public StatemachineActionFieldSourceMoreElements getStatemachineActionFieldSourceMoreAccess() {
+		return pStatemachineActionFieldSourceMore;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceMoreRule() {
+		return getStatemachineActionFieldSourceMoreAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceStringMore returns StatemachineActionFieldSourceString:
+	//	{StatemachineActionFieldSourceString} "+" text=STRING;
+	public StatemachineActionFieldSourceStringMoreElements getStatemachineActionFieldSourceStringMoreAccess() {
+		return pStatemachineActionFieldSourceStringMore;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceStringMoreRule() {
+		return getStatemachineActionFieldSourceStringMoreAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceNumberMore returns StatemachineActionFieldSourceNumber:
+	//	{StatemachineActionFieldSourceNumber} "+" value=SignedNumber;
+	public StatemachineActionFieldSourceNumberMoreElements getStatemachineActionFieldSourceNumberMoreAccess() {
+		return pStatemachineActionFieldSourceNumberMore;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceNumberMoreRule() {
+		return getStatemachineActionFieldSourceNumberMoreAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceEvaluateMore returns StatemachineActionFieldSourceEvaluate:
+	//	{StatemachineActionFieldSourceEvaluate} "+" evaluationtype=StatemachineEvaluationType;
+	public StatemachineActionFieldSourceEvaluateMoreElements getStatemachineActionFieldSourceEvaluateMoreAccess() {
+		return pStatemachineActionFieldSourceEvaluateMore;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceEvaluateMoreRule() {
+		return getStatemachineActionFieldSourceEvaluateMoreAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceTranslateMore returns StatemachineActionFieldSourceTranslate:
+	//	{StatemachineActionFieldSourceTranslate} "+" "translate" text=TRANSLATABLESTRING;
+	public StatemachineActionFieldSourceTranslateMoreElements getStatemachineActionFieldSourceTranslateMoreAccess() {
+		return pStatemachineActionFieldSourceTranslateMore;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceTranslateMoreRule() {
+		return getStatemachineActionFieldSourceTranslateMoreAccess().getRule();
+	}
+
+	//StatemachineActionFieldGetMore returns StatemachineActionFieldGet:
+	//	{StatemachineActionFieldGet} "+" "get" attribute=[StatemachineControlFieldAttribute];
+	public StatemachineActionFieldGetMoreElements getStatemachineActionFieldGetMoreAccess() {
+		return pStatemachineActionFieldGetMore;
+	}
+	
+	public ParserRule getStatemachineActionFieldGetMoreRule() {
+		return getStatemachineActionFieldGetMoreAccess().getRule();
+	}
+
+	//StatemachineOperationMore returns StatemachineOperation:
+	//	{StatemachineOperation} "+" "operation" operation=[function::FunctionLibraryOperation];
+	public StatemachineOperationMoreElements getStatemachineOperationMoreAccess() {
+		return pStatemachineOperationMore;
+	}
+	
+	public ParserRule getStatemachineOperationMoreRule() {
+		return getStatemachineOperationMoreAccess().getRule();
+	}
+
+	//StatemachineStorageRetrieveMore returns StatemachineStorageRetrieve:
+	//	{StatemachineStorageRetrieve} "+" "retrieve" "from" key=ID "." attribute=ID;
+	public StatemachineStorageRetrieveMoreElements getStatemachineStorageRetrieveMoreAccess() {
+		return pStatemachineStorageRetrieveMore;
+	}
+	
+	public ParserRule getStatemachineStorageRetrieveMoreRule() {
+		return getStatemachineStorageRetrieveMoreAccess().getRule();
+	}
+
+	//StatemachineActionFieldSourceDtoAttributeMore returns StatemachineActionFieldSourceDtoAttribute:
+	//	{StatemachineActionFieldSourceDtoAttribute} "+" "dto" dto=[StatemachineControlDTOAttribute] "."
+	//	attribute=[dto::LDtoInheritedAttribute];
+	public StatemachineActionFieldSourceDtoAttributeMoreElements getStatemachineActionFieldSourceDtoAttributeMoreAccess() {
+		return pStatemachineActionFieldSourceDtoAttributeMore;
+	}
+	
+	public ParserRule getStatemachineActionFieldSourceDtoAttributeMoreRule() {
+		return getStatemachineActionFieldSourceDtoAttributeMoreAccess().getRule();
+	}
+
+	//StatemachineActionFieldConcatenation:
+	//	first=StatemachineActionFieldSource more+=StatemachineActionFieldSourceMore*;
+	public StatemachineActionFieldConcatenationElements getStatemachineActionFieldConcatenationAccess() {
+		return pStatemachineActionFieldConcatenation;
+	}
+	
+	public ParserRule getStatemachineActionFieldConcatenationRule() {
+		return getStatemachineActionFieldConcatenationAccess().getRule();
+	}
+
+	//StatemachineOperationParameter:
+	//	source=StatemachineActionFieldConcatenation;
+	public StatemachineOperationParameterElements getStatemachineOperationParameterAccess() {
+		return pStatemachineOperationParameter;
+	}
+	
+	public ParserRule getStatemachineOperationParameterRule() {
+		return getStatemachineOperationParameterAccess().getRule();
+	}
+
+	//StatemachineOperationParameterMore returns StatemachineOperationParameter:
+	//	{StatemachineOperationParameter} "," source=StatemachineActionFieldConcatenation;
+	public StatemachineOperationParameterMoreElements getStatemachineOperationParameterMoreAccess() {
+		return pStatemachineOperationParameterMore;
+	}
+	
+	public ParserRule getStatemachineOperationParameterMoreRule() {
+		return getStatemachineOperationParameterMoreAccess().getRule();
+	}
+
+	//StatemachineActionFieldSet:
+	//	"set" source=StatemachineActionFieldConcatenation "@" attribute=[StatemachineControlFieldAttribute];
+	public StatemachineActionFieldSetElements getStatemachineActionFieldSetAccess() {
+		return pStatemachineActionFieldSet;
+	}
+	
+	public ParserRule getStatemachineActionFieldSetRule() {
+		return getStatemachineActionFieldSetAccess().getRule();
+	}
+
+	//StatemachineActionFieldClear:
+	//	"clear" attribute=[StatemachineControlFieldAttribute];
+	public StatemachineActionFieldClearElements getStatemachineActionFieldClearAccess() {
+		return pStatemachineActionFieldClear;
+	}
+	
+	public ParserRule getStatemachineActionFieldClearRule() {
+		return getStatemachineActionFieldClearAccess().getRule();
+	}
+
+	//StatemachineActionFieldGet:
+	//	"get" attribute=[StatemachineControlFieldAttribute];
+	public StatemachineActionFieldGetElements getStatemachineActionFieldGetAccess() {
+		return pStatemachineActionFieldGet;
+	}
+	
+	public ParserRule getStatemachineActionFieldGetRule() {
+		return getStatemachineActionFieldGetAccess().getRule();
+	}
+
+	//StatemachineActionFieldRemove:
+	//	"remove" attribute=[StatemachineControlFieldAttribute];
+	public StatemachineActionFieldRemoveElements getStatemachineActionFieldRemoveAccess() {
+		return pStatemachineActionFieldRemove;
+	}
+	
+	public ParserRule getStatemachineActionFieldRemoveRule() {
+		return getStatemachineActionFieldRemoveAccess().getRule();
+	}
+
+	//StatemachineControlVisibility:
+	//	StatemachineControlFieldAttribute | StatemachineControlFieldLayout | StatemachineControlButtonAttribute |
+	//	StatemachineControlButton;
+	public StatemachineControlVisibilityElements getStatemachineControlVisibilityAccess() {
+		return pStatemachineControlVisibility;
+	}
+	
+	public ParserRule getStatemachineControlVisibilityRule() {
+		return getStatemachineControlVisibilityAccess().getRule();
+	}
+
+	//StatemachineActionItemVisible:
+	//	"visible" attribute=[StatemachineControlVisibility];
+	public StatemachineActionItemVisibleElements getStatemachineActionItemVisibleAccess() {
+		return pStatemachineActionItemVisible;
+	}
+	
+	public ParserRule getStatemachineActionItemVisibleRule() {
+		return getStatemachineActionItemVisibleAccess().getRule();
+	}
+
+	//StatemachineActionItemInvisible:
+	//	"invisible" attribute=[StatemachineControlVisibility];
+	public StatemachineActionItemInvisibleElements getStatemachineActionItemInvisibleAccess() {
+		return pStatemachineActionItemInvisible;
+	}
+	
+	public ParserRule getStatemachineActionItemInvisibleRule() {
+		return getStatemachineActionItemInvisibleAccess().getRule();
+	}
+
+	//// buttons
+	//StatemachineActionButtonCaption:
+	//	"caption" caption=StatemachineActionFieldConcatenation "@" attribute=[StatemachineControlButtonAttribute];
+	public StatemachineActionButtonCaptionElements getStatemachineActionButtonCaptionAccess() {
+		return pStatemachineActionButtonCaption;
+	}
+	
+	public ParserRule getStatemachineActionButtonCaptionRule() {
+		return getStatemachineActionButtonCaptionAccess().getRule();
+	}
+
+	//StatemachineActionButtonImage:
+	//	"image" image=STRING "@" attribute=[StatemachineControlButtonAttribute];
+	public StatemachineActionButtonImageElements getStatemachineActionButtonImageAccess() {
+		return pStatemachineActionButtonImage;
+	}
+	
+	public ParserRule getStatemachineActionButtonImageRule() {
+		return getStatemachineActionButtonImageAccess().getRule();
+	}
+
+	//// dto
+	//StatemachineActionDTOFind:
+	//	"search" search=StatemachineActionFieldConcatenation "in" dto=[StatemachineControlDTOAttribute] "."
+	//	attribute=[dto::LDtoInheritedAttribute];
+	public StatemachineActionDTOFindElements getStatemachineActionDTOFindAccess() {
+		return pStatemachineActionDTOFind;
+	}
+	
+	public ParserRule getStatemachineActionDTOFindRule() {
+		return getStatemachineActionDTOFindAccess().getRule();
+	}
+
+	//StatemachineActionScheduler:
+	//	"schedule" scheduler=[StatemachineControlSchedulerAttribute];
+	public StatemachineActionSchedulerElements getStatemachineActionSchedulerAccess() {
+		return pStatemachineActionScheduler;
+	}
+	
+	public ParserRule getStatemachineActionSchedulerRule() {
+		return getStatemachineActionSchedulerAccess().getRule();
+	}
+
+	//StatemachineControl:
+	//	StatemachineControlButton | StatemachineControlField | StatemachineControlDTO | StatemachineControlScheduler |
+	//	StatemachineControlPeripheral;
+	public StatemachineControlElements getStatemachineControlAccess() {
+		return pStatemachineControl;
+	}
+	
+	public ParserRule getStatemachineControlRule() {
+		return getStatemachineControlAccess().getRule();
+	}
+
+	//StatemachineControlButton:
+	//	"keypad" name=ID "event" eventType=StatemachineControlButtonEventType "{"
+	//	buttons+=StatemachineControlButtonAttribute* "}";
+	public StatemachineControlButtonElements getStatemachineControlButtonAccess() {
+		return pStatemachineControlButton;
+	}
+	
+	public ParserRule getStatemachineControlButtonRule() {
+		return getStatemachineControlButtonAccess().getRule();
+	}
+
+	//StatemachineControlField:
+	//	"fields" name=ID "{" (fields+=StatemachineControlFieldAttribute* & layouts+=StatemachineControlFieldLayout*) "}";
+	public StatemachineControlFieldElements getStatemachineControlFieldAccess() {
+		return pStatemachineControlField;
+	}
+	
+	public ParserRule getStatemachineControlFieldRule() {
+		return getStatemachineControlFieldAccess().getRule();
+	}
+
+	//StatemachineControlDTO:
+	//	"dataProvider" name=ID "{" dtos+=StatemachineControlDTOAttribute* "}";
+	public StatemachineControlDTOElements getStatemachineControlDTOAccess() {
+		return pStatemachineControlDTO;
+	}
+	
+	public ParserRule getStatemachineControlDTORule() {
+		return getStatemachineControlDTOAccess().getRule();
+	}
+
+	//StatemachineControlScheduler:
+	//	"scheduler" name=ID "{" schedulers+=StatemachineControlSchedulerAttribute* "}";
+	public StatemachineControlSchedulerElements getStatemachineControlSchedulerAccess() {
+		return pStatemachineControlScheduler;
+	}
+	
+	public ParserRule getStatemachineControlSchedulerRule() {
+		return getStatemachineControlSchedulerAccess().getRule();
+	}
+
+	//StatemachinePeripheralDeviceLineDisplay:
+	//	"lineDisplay" name=ID;
+	public StatemachinePeripheralDeviceLineDisplayElements getStatemachinePeripheralDeviceLineDisplayAccess() {
+		return pStatemachinePeripheralDeviceLineDisplay;
+	}
+	
+	public ParserRule getStatemachinePeripheralDeviceLineDisplayRule() {
+		return getStatemachinePeripheralDeviceLineDisplayAccess().getRule();
+	}
+
+	//StatemachinePeripheralDevicePOSPrinter:
+	//	"posPrinter" name=ID;
+	public StatemachinePeripheralDevicePOSPrinterElements getStatemachinePeripheralDevicePOSPrinterAccess() {
+		return pStatemachinePeripheralDevicePOSPrinter;
+	}
+	
+	public ParserRule getStatemachinePeripheralDevicePOSPrinterRule() {
+		return getStatemachinePeripheralDevicePOSPrinterAccess().getRule();
+	}
+
+	//StatemachinePeripheralDeviceCashDrawer:
+	//	"cashDrawer" name=ID;
+	public StatemachinePeripheralDeviceCashDrawerElements getStatemachinePeripheralDeviceCashDrawerAccess() {
+		return pStatemachinePeripheralDeviceCashDrawer;
+	}
+	
+	public ParserRule getStatemachinePeripheralDeviceCashDrawerRule() {
+		return getStatemachinePeripheralDeviceCashDrawerAccess().getRule();
+	}
+
+	//StatemachinePeripheralDevicePT:
+	//	"payment" name=ID;
+	public StatemachinePeripheralDevicePTElements getStatemachinePeripheralDevicePTAccess() {
+		return pStatemachinePeripheralDevicePT;
+	}
+	
+	public ParserRule getStatemachinePeripheralDevicePTRule() {
+		return getStatemachinePeripheralDevicePTAccess().getRule();
+	}
+
+	//StatemachineControlPeripheral:
+	//	"peripheral" name=ID "{" lineDisplays+=StatemachinePeripheralDeviceLineDisplay*
+	//	posPrinters+=StatemachinePeripheralDevicePOSPrinter* cashDrawers+=StatemachinePeripheralDeviceCashDrawer*
+	//	paymentTerminals+=StatemachinePeripheralDevicePT* "}";
+	public StatemachineControlPeripheralElements getStatemachineControlPeripheralAccess() {
+		return pStatemachineControlPeripheral;
+	}
+	
+	public ParserRule getStatemachineControlPeripheralRule() {
+		return getStatemachineControlPeripheralAccess().getRule();
+	}
+
+	//StatemachineControlButtonAttribute:
+	//	"button" name=TRANSLATABLEID (hasImage?="image" image=STRING)? event=StatemachineControlButtonAttributeEvent;
+	public StatemachineControlButtonAttributeElements getStatemachineControlButtonAttributeAccess() {
+		return pStatemachineControlButtonAttribute;
+	}
+	
+	public ParserRule getStatemachineControlButtonAttributeRule() {
+		return getStatemachineControlButtonAttributeAccess().getRule();
+	}
+
+	//StatemachineControlButtonAttributeEvent:
+	//	StatemachineControlButtonAttributeEventKeyboard | StatemachineControlButtonAttributeEventIdentity |
+	//	StatemachineControlButtonAttributeEventEvent;
+	public StatemachineControlButtonAttributeEventElements getStatemachineControlButtonAttributeEventAccess() {
+		return pStatemachineControlButtonAttributeEvent;
+	}
+	
+	public ParserRule getStatemachineControlButtonAttributeEventRule() {
+		return getStatemachineControlButtonAttributeEventAccess().getRule();
+	}
+
+	//StatemachineControlButtonAttributeEventKeyboard:
+	//	{StatemachineControlButtonAttributeEventKeyboard} "key" keystroke=STRING;
+	public StatemachineControlButtonAttributeEventKeyboardElements getStatemachineControlButtonAttributeEventKeyboardAccess() {
+		return pStatemachineControlButtonAttributeEventKeyboard;
+	}
+	
+	public ParserRule getStatemachineControlButtonAttributeEventKeyboardRule() {
+		return getStatemachineControlButtonAttributeEventKeyboardAccess().getRule();
+	}
+
+	//StatemachineControlButtonAttributeEventIdentity:
+	//	{StatemachineControlButtonAttributeEventIdentity} "id" identity=INT;
+	public StatemachineControlButtonAttributeEventIdentityElements getStatemachineControlButtonAttributeEventIdentityAccess() {
+		return pStatemachineControlButtonAttributeEventIdentity;
+	}
+	
+	public ParserRule getStatemachineControlButtonAttributeEventIdentityRule() {
+		return getStatemachineControlButtonAttributeEventIdentityAccess().getRule();
+	}
+
+	//StatemachineControlButtonAttributeEventEvent:
+	//	{StatemachineControlButtonAttributeEventEvent} "event" event=[StatemachineEvent];
+	public StatemachineControlButtonAttributeEventEventElements getStatemachineControlButtonAttributeEventEventAccess() {
+		return pStatemachineControlButtonAttributeEventEvent;
+	}
+	
+	public ParserRule getStatemachineControlButtonAttributeEventEventRule() {
+		return getStatemachineControlButtonAttributeEventEventAccess().getRule();
+	}
+
+	//StatemachineControlFieldAttribute:
+	//	"field" name=TRANSLATABLEID "type" attributeType=StatemachineFieldType;
+	public StatemachineControlFieldAttributeElements getStatemachineControlFieldAttributeAccess() {
+		return pStatemachineControlFieldAttribute;
+	}
+	
+	public ParserRule getStatemachineControlFieldAttributeRule() {
+		return getStatemachineControlFieldAttributeAccess().getRule();
+	}
+
+	//StatemachineControlFieldLayout:
+	//	"layout" name=ID;
+	public StatemachineControlFieldLayoutElements getStatemachineControlFieldLayoutAccess() {
+		return pStatemachineControlFieldLayout;
+	}
+	
+	public ParserRule getStatemachineControlFieldLayoutRule() {
+		return getStatemachineControlFieldLayoutAccess().getRule();
+	}
+
+	//StatemachineControlDTOAttribute:
+	//	"dto" name=ID "type" attributeType=StatemachineDTOType (hasEvent?="event" event=[StatemachineEvent])?;
+	public StatemachineControlDTOAttributeElements getStatemachineControlDTOAttributeAccess() {
+		return pStatemachineControlDTOAttribute;
+	}
+	
+	public ParserRule getStatemachineControlDTOAttributeRule() {
+		return getStatemachineControlDTOAttributeAccess().getRule();
+	}
+
+	//StatemachineControlSchedulerAttribute:
+	//	"scheduler" name=ID "delay" delay=INT "send" event=[StatemachineEvent];
+	public StatemachineControlSchedulerAttributeElements getStatemachineControlSchedulerAttributeAccess() {
+		return pStatemachineControlSchedulerAttribute;
+	}
+	
+	public ParserRule getStatemachineControlSchedulerAttributeRule() {
+		return getStatemachineControlSchedulerAttributeAccess().getRule();
+	}
+
+	//StatemachineDTOType:
+	//	attributeType=[dto::LDto];
+	public StatemachineDTOTypeElements getStatemachineDTOTypeAccess() {
+		return pStatemachineDTOType;
+	}
+	
+	public ParserRule getStatemachineDTOTypeRule() {
+		return getStatemachineDTOTypeAccess().getRule();
+	}
+
+	//StatemachineFieldType:
+	//	attributeType=StatemachineInternalType;
+	public StatemachineFieldTypeElements getStatemachineFieldTypeAccess() {
+		return pStatemachineFieldType;
+	}
+	
+	public ParserRule getStatemachineFieldTypeRule() {
+		return getStatemachineFieldTypeAccess().getRule();
+	}
+
+	//enum StatemachineInternalType:
+	//	BOOLEAN="Boolean" | INTEGER="Integer" | LONG="Long" | DOUBLE="Double" | STRING="String" | DATE="Date" |
+	//	SUGGESTTEXT="SuggestText";
+	public StatemachineInternalTypeElements getStatemachineInternalTypeAccess() {
+		return unknownRuleStatemachineInternalType;
+	}
+	
+	public EnumRule getStatemachineInternalTypeRule() {
+		return getStatemachineInternalTypeAccess().getRule();
+	}
+
+	//enum StatemachineControlButtonEventType:
+	//	KEYBOARD="keyboard" | TRIGGER="trigger" | IDENTITY="identity";
+	public StatemachineControlButtonEventTypeElements getStatemachineControlButtonEventTypeAccess() {
+		return unknownRuleStatemachineControlButtonEventType;
+	}
+	
+	public EnumRule getStatemachineControlButtonEventTypeRule() {
+		return getStatemachineControlButtonEventTypeAccess().getRule();
+	}
+
+	//enum StatemachineEvaluationType:
+	//	IP_ADDRESS="getIPAddress" | NOW="getNow" | USER_AGENT_INFO="getUserAgentInfo" | IS_TOUCH_DEVICE="isTouchDevice" |
+	//	IS_HTTPS="isHttps" | BROWSER_LOCALE="getBrowserLocale" | USER_NAME="getUserName" | USER_PASSWORD="getUserPassword" |
+	//	USER_EMAIL="getUserEmail" | USER_POSITION="getUserPosition" | USER_PRTSERVICE="getUserPrintService" |
+	//	SCREEN_WIDTH="getSceenWidth" | SCREEN_HEIGHT="getScreenHeight" | TRIGGER="getTrigger";
+	public StatemachineEvaluationTypeElements getStatemachineEvaluationTypeAccess() {
+		return unknownRuleStatemachineEvaluationType;
+	}
+	
+	public EnumRule getStatemachineEvaluationTypeRule() {
+		return getStatemachineEvaluationTypeAccess().getRule();
+	}
+
+	//enum StatemachineUserMessageType:
+	//	HUMANIZED_MESSAGE="humanized" | WARNING_MESSAGE="warning" | ERROR_MESSAGE="error" | TRAY_NOTIFICATION="tray" |
+	//	ASSISTIVE_NOTIFICATION="assistive";
+	public StatemachineUserMessageTypeElements getStatemachineUserMessageTypeAccess() {
+		return unknownRuleStatemachineUserMessageType;
+	}
+	
+	public EnumRule getStatemachineUserMessageTypeRule() {
+		return getStatemachineUserMessageTypeAccess().getRule();
+	}
+
+	//enum StatemachineLineDisplayCursorType:
+	//	DISP_CT_NONE="none" | DISP_CT_FIXED="fixed" | DISP_CT_BLOCK="block" | DISP_CT_HALFBLOCK="halfblock" |
+	//	DISP_CT_UNDERLINE="underline" | DISP_CT_REVERSE="reverse" | DISP_CT_OTHER="other" | DISP_CT_BLINK="blink";
+	public StatemachineLineDisplayCursorTypeElements getStatemachineLineDisplayCursorTypeAccess() {
+		return unknownRuleStatemachineLineDisplayCursorType;
+	}
+	
+	public EnumRule getStatemachineLineDisplayCursorTypeRule() {
+		return getStatemachineLineDisplayCursorTypeAccess().getRule();
+	}
+
+	//enum StatemachineLineDisplayMarqueeType:
+	//	DISP_MT_NONE="none" | DISP_MT_UP="up" | DISP_MT_DOWN="down" | DISP_MT_LEFT="left" | DISP_MT_RIGHT="right" |
+	//	DISP_MT_INIT="init";
+	public StatemachineLineDisplayMarqueeTypeElements getStatemachineLineDisplayMarqueeTypeAccess() {
+		return unknownRuleStatemachineLineDisplayMarqueeType;
+	}
+	
+	public EnumRule getStatemachineLineDisplayMarqueeTypeRule() {
+		return getStatemachineLineDisplayMarqueeTypeAccess().getRule();
+	}
+
+	//enum StatemachineLineDisplayMarqueeFormat:
+	//	DISP_MF_WALK="walk" | DISP_MF_PLACE="place";
+	public StatemachineLineDisplayMarqueeFormatElements getStatemachineLineDisplayMarqueeFormatAccess() {
+		return unknownRuleStatemachineLineDisplayMarqueeFormat;
+	}
+	
+	public EnumRule getStatemachineLineDisplayMarqueeFormatRule() {
+		return getStatemachineLineDisplayMarqueeFormatAccess().getRule();
+	}
+
+	//enum StatemachineLineDisplayTextType:
+	//	DISP_DT_NORMAL="normal" | DISP_DT_BLINK="blink" | DISP_DT_REVERSE="reverse" | DISP_DT_BLINK_REVERSE="blinkreverse";
+	public StatemachineLineDisplayTextTypeElements getStatemachineLineDisplayTextTypeAccess() {
+		return unknownRuleStatemachineLineDisplayTextType;
+	}
+	
+	public EnumRule getStatemachineLineDisplayTextTypeRule() {
+		return getStatemachineLineDisplayTextTypeAccess().getRule();
+	}
+
+	//enum StatemachineLineDisplayScrollTextType:
+	//	DISP_ST_UP="up" | DISP_ST_DOWN="down" | DISP_ST_LEFT="left" | DISP_ST_RIGHT="right";
+	public StatemachineLineDisplayScrollTextTypeElements getStatemachineLineDisplayScrollTextTypeAccess() {
+		return unknownRuleStatemachineLineDisplayScrollTextType;
+	}
+	
+	public EnumRule getStatemachineLineDisplayScrollTextTypeRule() {
+		return getStatemachineLineDisplayScrollTextTypeAccess().getRule();
+	}
+
+	//enum StatemachinePOSPrinterBarcodeType:
+	//	PTR_BCS_UPCA="upca" | PTR_BCS_UPCE="upcb" | PTR_BCS_JAN8="jan8" | PTR_BCS_EAN8="ean8" | PTR_BCS_JAN13="jan13" |
+	//	PTR_BCS_EAN13="ean13" | PTR_BCS_TF="tf" | PTR_BCS_ITF="itf" | PTR_BCS_Codabar="codeabar" | PTR_BCS_Code39="code39" |
+	//	PTR_BCS_Code93="code93" | PTR_BCS_Code128="code128" | PTR_BCS_UPCA_S="upca_s" | PTR_BCS_UPCE_S="upce_s" |
+	//	PTR_BCS_UPCD1="upcd1" | PTR_BCS_UPCD2="upcd2" | PTR_BCS_UPCD3="upcd3" | PTR_BCS_UPCD4="upcd4" | PTR_BCS_UPCD5="upcd5"
+	//	| PTR_BCS_EAN8_S="ean8_s" | PTR_BCS_EAN13_S="ean13_s" | PTR_BCS_EAN128="ean128" | PTR_BCS_OCRA="orca" |
+	//	PTR_BCS_OCRB="ocrb" | PTR_BCS_Code128_Parsed="code128_parsed" | PTR_BCS_GS1DATABAR="gs1databar" |
+	//	PTR_BCS_GS1DATABAR_E="gs1databar_e" | PTR_BCS_GS1DATABAR_S="gs1databar_s" | PTR_BCS_GS1DATABAR_E_S="gs1databar_e_s" |
+	//	PTR_BCS_PDF417="pdf417" | PTR_BCS_MAXICODE="maxicode" | PTR_BCS_DATAMATRIX="datamatrix" | PTR_BCS_QRCODE="qrcode" |
+	//	PTR_BCS_UQRCODE="uqrcode" | PTR_BCS_AZTEC="aztec" | PTR_BCS_UPDF417="updf417";
+	public StatemachinePOSPrinterBarcodeTypeElements getStatemachinePOSPrinterBarcodeTypeAccess() {
+		return unknownRuleStatemachinePOSPrinterBarcodeType;
+	}
+	
+	public EnumRule getStatemachinePOSPrinterBarcodeTypeRule() {
+		return getStatemachinePOSPrinterBarcodeTypeAccess().getRule();
+	}
+
+	//StatemachineImport returns types::LImport:
+	//	"import" importedNamespace=StatemachineQualifiedNameWithWildCard;
+	public StatemachineImportElements getStatemachineImportAccess() {
+		return pStatemachineImport;
+	}
+	
+	public ParserRule getStatemachineImportRule() {
+		return getStatemachineImportAccess().getRule();
+	}
+
+	//StatemachineQualifiedNameWithWildCard:
+	//	QualifiedName ("." "*")?;
+	public StatemachineQualifiedNameWithWildCardElements getStatemachineQualifiedNameWithWildCardAccess() {
+		return pStatemachineQualifiedNameWithWildCard;
+	}
+	
+	public ParserRule getStatemachineQualifiedNameWithWildCardRule() {
+		return getStatemachineQualifiedNameWithWildCardAccess().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();
+	}
+
+	//TRANSLATABLESTRING:
+	//	STRING;
+	public TRANSLATABLESTRINGElements getTRANSLATABLESTRINGAccess() {
+		return pTRANSLATABLESTRING;
+	}
+	
+	public ParserRule getTRANSLATABLESTRINGRule() {
+		return getTRANSLATABLESTRINGAccess().getRule();
+	}
+
+	//TRANSLATABLEID:
+	//	ID;
+	public TRANSLATABLEIDElements getTRANSLATABLEIDAccess() {
+		return pTRANSLATABLEID;
+	}
+	
+	public ParserRule getTRANSLATABLEIDRule() {
+		return getTRANSLATABLEIDAccess().getRule();
+	}
+
+	//SignedNumber returns ecore::EDouble:
+	//	"-"? UnsignedNumber;
+	public SignedNumberElements getSignedNumberAccess() {
+		return pSignedNumber;
+	}
+	
+	public ParserRule getSignedNumberRule() {
+		return getSignedNumberAccess().getRule();
+	}
+
+	//UnsignedNumber returns ecore::EDouble:
+	//	INT ("." INT)?;
+	public UnsignedNumberElements getUnsignedNumberAccess() {
+		return pUnsignedNumber;
+	}
+	
+	public ParserRule getUnsignedNumberRule() {
+		return getUnsignedNumberAccess().getRule();
+	}
+
+	//XAnnotation:
+	//	{XAnnotation} "@" annotationType=[types::JvmAnnotationType|QualifiedName] ("("
+	//	(elementValuePairs+=XAnnotationElementValuePair ("," elementValuePairs+=XAnnotationElementValuePair)* |
+	//	value=XAnnotationElementValueOrCommaList)? ")")?;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationElements getXAnnotationAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationAccess();
+	}
+	
+	public ParserRule getXAnnotationRule() {
+		return getXAnnotationAccess().getRule();
+	}
+
+	//XAnnotationElementValuePair:
+	//	=> (element=[types::JvmOperation|ValidID] "=") value=XAnnotationElementValue;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValuePairElements getXAnnotationElementValuePairAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationElementValuePairAccess();
+	}
+	
+	public ParserRule getXAnnotationElementValuePairRule() {
+		return getXAnnotationElementValuePairAccess().getRule();
+	}
+
+	//XAnnotationElementValueOrCommaList returns xbase::XExpression:
+	//	=> ({xbase::XListLiteral} "#" "[") (elements+=XAnnotationOrExpression ("," elements+=XAnnotationOrExpression)*)? "]"
+	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} ("," elements+=XAnnotationOrExpression)+)?;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueOrCommaListElements getXAnnotationElementValueOrCommaListAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationElementValueOrCommaListAccess();
+	}
+	
+	public ParserRule getXAnnotationElementValueOrCommaListRule() {
+		return getXAnnotationElementValueOrCommaListAccess().getRule();
+	}
+
+	//XAnnotationElementValue returns xbase::XExpression:
+	//	=> ({xbase::XListLiteral} "#" "[") (elements+=XAnnotationOrExpression ("," elements+=XAnnotationOrExpression)*)? "]"
+	//	| XAnnotationOrExpression;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
+	}
+	
+	public ParserRule getXAnnotationElementValueRule() {
+		return getXAnnotationElementValueAccess().getRule();
+	}
+
+	//XAnnotationOrExpression returns xbase::XExpression:
+	//	XAnnotation | XExpression;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
+	}
+	
+	public ParserRule getXAnnotationOrExpressionRule() {
+		return getXAnnotationOrExpressionAccess().getRule();
+	}
+
+	//XExpression:
+	//	XAssignment;
+	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
+		return gaXbaseWithAnnotations.getXExpressionAccess();
+	}
+	
+	public ParserRule getXExpressionRule() {
+		return getXExpressionAccess().getRule();
+	}
+
+	//XAssignment returns XExpression:
+	//	{XAssignment} feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign value=XAssignment | XOrExpression
+	//	(=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMultiAssign])
+	//	rightOperand=XAssignment)?;
+	public XbaseGrammarAccess.XAssignmentElements getXAssignmentAccess() {
+		return gaXbaseWithAnnotations.getXAssignmentAccess();
+	}
+	
+	public ParserRule getXAssignmentRule() {
+		return getXAssignmentAccess().getRule();
+	}
+
+	//OpSingleAssign:
+	//	"=";
+	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
+		return gaXbaseWithAnnotations.getOpSingleAssignAccess();
+	}
+	
+	public ParserRule getOpSingleAssignRule() {
+		return getOpSingleAssignAccess().getRule();
+	}
+
+	//OpMultiAssign:
+	//	"+=" | "-=" | "*=" | "/=" | "%=" | "<" "<" "=" | ">" ">"? ">=";
+	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
+		return gaXbaseWithAnnotations.getOpMultiAssignAccess();
+	}
+	
+	public ParserRule getOpMultiAssignRule() {
+		return getOpMultiAssignAccess().getRule();
+	}
+
+	//XOrExpression returns XExpression:
+	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
+	//	rightOperand=XAndExpression)*;
+	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
+		return gaXbaseWithAnnotations.getXOrExpressionAccess();
+	}
+	
+	public ParserRule getXOrExpressionRule() {
+		return getXOrExpressionAccess().getRule();
+	}
+
+	//OpOr:
+	//	"||";
+	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
+		return gaXbaseWithAnnotations.getOpOrAccess();
+	}
+	
+	public ParserRule getOpOrRule() {
+		return getOpOrAccess().getRule();
+	}
+
+	//XAndExpression returns XExpression:
+	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
+	//	rightOperand=XEqualityExpression)*;
+	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
+		return gaXbaseWithAnnotations.getXAndExpressionAccess();
+	}
+	
+	public ParserRule getXAndExpressionRule() {
+		return getXAndExpressionAccess().getRule();
+	}
+
+	//OpAnd:
+	//	"&&";
+	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
+		return gaXbaseWithAnnotations.getOpAndAccess();
+	}
+	
+	public ParserRule getOpAndRule() {
+		return getOpAndAccess().getRule();
+	}
+
+	//XEqualityExpression returns XExpression:
+	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
+	//	rightOperand=XRelationalExpression)*;
+	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
+		return gaXbaseWithAnnotations.getXEqualityExpressionAccess();
+	}
+	
+	public ParserRule getXEqualityExpressionRule() {
+		return getXEqualityExpressionAccess().getRule();
+	}
+
+	//OpEquality:
+	//	"==" | "!=" | "===" | "!==";
+	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
+		return gaXbaseWithAnnotations.getOpEqualityAccess();
+	}
+	
+	public ParserRule getOpEqualityRule() {
+		return getOpEqualityAccess().getRule();
+	}
+
+	//XRelationalExpression returns XExpression:
+	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} "instanceof") type=JvmTypeReference | =>
+	//	({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
+	//	rightOperand=XOtherOperatorExpression)*;
+	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
+		return gaXbaseWithAnnotations.getXRelationalExpressionAccess();
+	}
+	
+	public ParserRule getXRelationalExpressionRule() {
+		return getXRelationalExpressionAccess().getRule();
+	}
+
+	//OpCompare:
+	//	">=" | "<" "=" | ">" | "<";
+	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
+		return gaXbaseWithAnnotations.getOpCompareAccess();
+	}
+	
+	public ParserRule getOpCompareRule() {
+		return getOpCompareAccess().getRule();
+	}
+
+	//XOtherOperatorExpression returns XExpression:
+	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
+	//	rightOperand=XAdditiveExpression)*;
+	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
+		return gaXbaseWithAnnotations.getXOtherOperatorExpressionAccess();
+	}
+	
+	public ParserRule getXOtherOperatorExpressionRule() {
+		return getXOtherOperatorExpressionAccess().getRule();
+	}
+
+	//OpOther:
+	//	"->" | "..<" | ">" ".." | ".." | "=>" | ">" (=> (">" ">") | ">") | "<" (=> ("<" "<") | "<" | "=>") | "<>" | "?:";
+	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
+		return gaXbaseWithAnnotations.getOpOtherAccess();
+	}
+	
+	public ParserRule getOpOtherRule() {
+		return getOpOtherAccess().getRule();
+	}
+
+	//XAdditiveExpression returns XExpression:
+	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
+	//	rightOperand=XMultiplicativeExpression)*;
+	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
+		return gaXbaseWithAnnotations.getXAdditiveExpressionAccess();
+	}
+	
+	public ParserRule getXAdditiveExpressionRule() {
+		return getXAdditiveExpressionAccess().getRule();
+	}
+
+	//OpAdd:
+	//	"+" | "-";
+	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
+		return gaXbaseWithAnnotations.getOpAddAccess();
+	}
+	
+	public ParserRule getOpAddRule() {
+		return getOpAddAccess().getRule();
+	}
+
+	//XMultiplicativeExpression returns XExpression:
+	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
+	//	rightOperand=XUnaryOperation)*;
+	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
+		return gaXbaseWithAnnotations.getXMultiplicativeExpressionAccess();
+	}
+	
+	public ParserRule getXMultiplicativeExpressionRule() {
+		return getXMultiplicativeExpressionAccess().getRule();
+	}
+
+	//OpMulti:
+	//	"*" | "**" | "/" | "%";
+	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
+		return gaXbaseWithAnnotations.getOpMultiAccess();
+	}
+	
+	public ParserRule getOpMultiRule() {
+		return getOpMultiAccess().getRule();
+	}
+
+	//XUnaryOperation returns XExpression:
+	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation | XCastedExpression;
+	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
+		return gaXbaseWithAnnotations.getXUnaryOperationAccess();
+	}
+	
+	public ParserRule getXUnaryOperationRule() {
+		return getXUnaryOperationAccess().getRule();
+	}
+
+	//OpUnary:
+	//	"!" | "-" | "+";
+	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
+		return gaXbaseWithAnnotations.getOpUnaryAccess();
+	}
+	
+	public ParserRule getOpUnaryRule() {
+		return getOpUnaryAccess().getRule();
+	}
+
+	//XCastedExpression returns XExpression:
+	//	XPostfixOperation (=> ({XCastedExpression.target=current} "as") type=JvmTypeReference)*;
+	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
+		return gaXbaseWithAnnotations.getXCastedExpressionAccess();
+	}
+	
+	public ParserRule getXCastedExpressionRule() {
+		return getXCastedExpressionAccess().getRule();
+	}
+
+	//XPostfixOperation returns XExpression:
+	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
+	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
+		return gaXbaseWithAnnotations.getXPostfixOperationAccess();
+	}
+	
+	public ParserRule getXPostfixOperationRule() {
+		return getXPostfixOperationAccess().getRule();
+	}
+
+	//OpPostfix:
+	//	"++" | "--";
+	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
+		return gaXbaseWithAnnotations.getOpPostfixAccess();
+	}
+	
+	public ParserRule getOpPostfixRule() {
+		return getOpPostfixAccess().getRule();
+	}
+
+	//XMemberFeatureCall returns XExpression:
+	//	XPrimaryExpression (=> ({XAssignment.assignable=current} ("." | explicitStatic?="::")
+	//	feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign) value=XAssignment | =>
+	//	({XMemberFeatureCall.memberCallTarget=current} ("." | nullSafe?="?." | explicitStatic?="::")) ("<"
+	//	typeArguments+=JvmArgumentTypeReference ("," typeArguments+=JvmArgumentTypeReference)* ">")?
+	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?="(" (memberCallArguments+=XShortClosure
+	//	| memberCallArguments+=XExpression ("," memberCallArguments+=XExpression)*)? ")")? memberCallArguments+=XClosure?)*;
+	public XbaseGrammarAccess.XMemberFeatureCallElements getXMemberFeatureCallAccess() {
+		return gaXbaseWithAnnotations.getXMemberFeatureCallAccess();
+	}
+	
+	public ParserRule getXMemberFeatureCallRule() {
+		return getXMemberFeatureCallAccess().getRule();
+	}
+
+	//XPrimaryExpression returns XExpression:
+	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
+	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
+	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
+	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
+		return gaXbaseWithAnnotations.getXPrimaryExpressionAccess();
+	}
+	
+	public ParserRule getXPrimaryExpressionRule() {
+		return getXPrimaryExpressionAccess().getRule();
+	}
+
+	//XLiteral returns XExpression:
+	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
+	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
+		return gaXbaseWithAnnotations.getXLiteralAccess();
+	}
+	
+	public ParserRule getXLiteralRule() {
+		return getXLiteralAccess().getRule();
+	}
+
+	//XCollectionLiteral:
+	//	XSetLiteral | XListLiteral;
+	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
+		return gaXbaseWithAnnotations.getXCollectionLiteralAccess();
+	}
+	
+	public ParserRule getXCollectionLiteralRule() {
+		return getXCollectionLiteralAccess().getRule();
+	}
+
+	//XSetLiteral:
+	//	{XSetLiteral} "#" "{" (elements+=XExpression ("," elements+=XExpression)*)? "}";
+	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
+		return gaXbaseWithAnnotations.getXSetLiteralAccess();
+	}
+	
+	public ParserRule getXSetLiteralRule() {
+		return getXSetLiteralAccess().getRule();
+	}
+
+	//XListLiteral:
+	//	{XListLiteral} "#" "[" (elements+=XExpression ("," elements+=XExpression)*)? "]";
+	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
+		return gaXbaseWithAnnotations.getXListLiteralAccess();
+	}
+	
+	public ParserRule getXListLiteralRule() {
+		return getXListLiteralAccess().getRule();
+	}
+
+	//XClosure returns XExpression:
+	//	=> ({XClosure} "[") => ((declaredFormalParameters+=JvmFormalParameter (","
+	//	declaredFormalParameters+=JvmFormalParameter)*)? explicitSyntax?="|")? expression=XExpressionInClosure "]";
+	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
+		return gaXbaseWithAnnotations.getXClosureAccess();
+	}
+	
+	public ParserRule getXClosureRule() {
+		return getXClosureAccess().getRule();
+	}
+
+	//XExpressionInClosure returns XExpression:
+	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ";"?)*;
+	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
+		return gaXbaseWithAnnotations.getXExpressionInClosureAccess();
+	}
+	
+	public ParserRule getXExpressionInClosureRule() {
+		return getXExpressionInClosureAccess().getRule();
+	}
+
+	//XShortClosure returns XExpression:
+	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter ("," declaredFormalParameters+=JvmFormalParameter)*)?
+	//	explicitSyntax?="|") expression=XExpression;
+	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
+		return gaXbaseWithAnnotations.getXShortClosureAccess();
+	}
+	
+	public ParserRule getXShortClosureRule() {
+		return getXShortClosureAccess().getRule();
+	}
+
+	//XParenthesizedExpression returns XExpression:
+	//	"(" XExpression ")";
+	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
+		return gaXbaseWithAnnotations.getXParenthesizedExpressionAccess();
+	}
+	
+	public ParserRule getXParenthesizedExpressionRule() {
+		return getXParenthesizedExpressionAccess().getRule();
+	}
+
+	//XIfExpression returns XExpression:
+	//	{XIfExpression} "if" "(" if=XExpression ")" then=XExpression ("else" else=XExpression)?;
+	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
+		return gaXbaseWithAnnotations.getXIfExpressionAccess();
+	}
+	
+	public ParserRule getXIfExpressionRule() {
+		return getXIfExpressionAccess().getRule();
+	}
+
+	//XSwitchExpression returns XExpression:
+	//	{XSwitchExpression} "switch" (=> ("(" declaredParam=JvmFormalParameter ":") switch=XExpression ")" | =>
+	//	(declaredParam=JvmFormalParameter ":")? switch=XExpression) "{" cases+=XCasePart* ("default" ":"
+	//	default=XExpression)? "}";
+	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
+		return gaXbaseWithAnnotations.getXSwitchExpressionAccess();
+	}
+	
+	public ParserRule getXSwitchExpressionRule() {
+		return getXSwitchExpressionAccess().getRule();
+	}
+
+	//XCasePart:
+	//	{XCasePart} typeGuard=JvmTypeReference? ("case" case=XExpression)? (":" then=XExpression | fallThrough?=",");
+	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
+		return gaXbaseWithAnnotations.getXCasePartAccess();
+	}
+	
+	public ParserRule getXCasePartRule() {
+		return getXCasePartAccess().getRule();
+	}
+
+	//XForLoopExpression returns XExpression:
+	//	=> ({XForLoopExpression} "for" "(" declaredParam=JvmFormalParameter ":") forExpression=XExpression ")"
+	//	eachExpression=XExpression;
+	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
+		return gaXbaseWithAnnotations.getXForLoopExpressionAccess();
+	}
+	
+	public ParserRule getXForLoopExpressionRule() {
+		return getXForLoopExpressionAccess().getRule();
+	}
+
+	//XBasicForLoopExpression returns XExpression:
+	//	{XBasicForLoopExpression} "for" "(" (initExpressions+=XExpressionOrVarDeclaration (","
+	//	initExpressions+=XExpressionOrVarDeclaration)*)? ";" expression=XExpression? ";" (updateExpressions+=XExpression (","
+	//	updateExpressions+=XExpression)*)? ")" eachExpression=XExpression;
+	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
+		return gaXbaseWithAnnotations.getXBasicForLoopExpressionAccess();
+	}
+	
+	public ParserRule getXBasicForLoopExpressionRule() {
+		return getXBasicForLoopExpressionAccess().getRule();
+	}
+
+	//XWhileExpression returns XExpression:
+	//	{XWhileExpression} "while" "(" predicate=XExpression ")" body=XExpression;
+	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
+		return gaXbaseWithAnnotations.getXWhileExpressionAccess();
+	}
+	
+	public ParserRule getXWhileExpressionRule() {
+		return getXWhileExpressionAccess().getRule();
+	}
+
+	//XDoWhileExpression returns XExpression:
+	//	{XDoWhileExpression} "do" body=XExpression "while" "(" predicate=XExpression ")";
+	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
+		return gaXbaseWithAnnotations.getXDoWhileExpressionAccess();
+	}
+	
+	public ParserRule getXDoWhileExpressionRule() {
+		return getXDoWhileExpressionAccess().getRule();
+	}
+
+	//XBlockExpression returns XExpression:
+	//	{XBlockExpression} "{" (expressions+=XExpressionOrVarDeclaration ";"?)* "}";
+	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
+		return gaXbaseWithAnnotations.getXBlockExpressionAccess();
+	}
+	
+	public ParserRule getXBlockExpressionRule() {
+		return getXBlockExpressionAccess().getRule();
+	}
+
+	//XExpressionOrVarDeclaration returns XExpression:
+	//	XVariableDeclaration | XExpression;
+	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
+		return gaXbaseWithAnnotations.getXExpressionOrVarDeclarationAccess();
+	}
+	
+	public ParserRule getXExpressionOrVarDeclarationRule() {
+		return getXExpressionOrVarDeclarationAccess().getRule();
+	}
+
+	//XVariableDeclaration returns XExpression:
+	//	{XVariableDeclaration} (writeable?="var" | "val") (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ("="
+	//	right=XExpression)?;
+	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
+		return gaXbaseWithAnnotations.getXVariableDeclarationAccess();
+	}
+	
+	public ParserRule getXVariableDeclarationRule() {
+		return getXVariableDeclarationAccess().getRule();
+	}
+
+	//JvmFormalParameter returns types::JvmFormalParameter:
+	//	parameterType=JvmTypeReference? name=ValidID;
+	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
+		return gaXbaseWithAnnotations.getJvmFormalParameterAccess();
+	}
+	
+	public ParserRule getJvmFormalParameterRule() {
+		return getJvmFormalParameterAccess().getRule();
+	}
+
+	//FullJvmFormalParameter returns types::JvmFormalParameter:
+	//	parameterType=JvmTypeReference name=ValidID;
+	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
+		return gaXbaseWithAnnotations.getFullJvmFormalParameterAccess();
+	}
+	
+	public ParserRule getFullJvmFormalParameterRule() {
+		return getFullJvmFormalParameterAccess().getRule();
+	}
+
+	//XFeatureCall returns XExpression:
+	//	{XFeatureCall} ("<" typeArguments+=JvmArgumentTypeReference ("," typeArguments+=JvmArgumentTypeReference)* ">")?
+	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?="(" (featureCallArguments+=XShortClosure
+	//	| featureCallArguments+=XExpression ("," featureCallArguments+=XExpression)*)? ")")? featureCallArguments+=XClosure?;
+	public XbaseGrammarAccess.XFeatureCallElements getXFeatureCallAccess() {
+		return gaXbaseWithAnnotations.getXFeatureCallAccess();
+	}
+	
+	public ParserRule getXFeatureCallRule() {
+		return getXFeatureCallAccess().getRule();
+	}
+
+	//FeatureCallID:
+	//	ValidID | "extends" | "static" | "import" | "extension";
+	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
+		return gaXbaseWithAnnotations.getFeatureCallIDAccess();
+	}
+	
+	public ParserRule getFeatureCallIDRule() {
+		return getFeatureCallIDAccess().getRule();
+	}
+
+	//IdOrSuper:
+	//	FeatureCallID | "super";
+	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
+		return gaXbaseWithAnnotations.getIdOrSuperAccess();
+	}
+	
+	public ParserRule getIdOrSuperRule() {
+		return getIdOrSuperAccess().getRule();
+	}
+
+	//XConstructorCall returns XExpression:
+	//	{XConstructorCall} "new" constructor=[types::JvmConstructor|QualifiedName] ("<"
+	//	typeArguments+=JvmArgumentTypeReference ("," typeArguments+=JvmArgumentTypeReference)* ">")? (=>
+	//	explicitConstructorCall?="(" (arguments+=XShortClosure | arguments+=XExpression ("," arguments+=XExpression)*)? ")")?
+	//	arguments+=XClosure?;
+	public XbaseGrammarAccess.XConstructorCallElements getXConstructorCallAccess() {
+		return gaXbaseWithAnnotations.getXConstructorCallAccess();
+	}
+	
+	public ParserRule getXConstructorCallRule() {
+		return getXConstructorCallAccess().getRule();
+	}
+
+	//XBooleanLiteral returns XExpression:
+	//	{XBooleanLiteral} ("false" | isTrue?="true");
+	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
+		return gaXbaseWithAnnotations.getXBooleanLiteralAccess();
+	}
+	
+	public ParserRule getXBooleanLiteralRule() {
+		return getXBooleanLiteralAccess().getRule();
+	}
+
+	//XNullLiteral returns XExpression:
+	//	{XNullLiteral} "null";
+	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
+		return gaXbaseWithAnnotations.getXNullLiteralAccess();
+	}
+	
+	public ParserRule getXNullLiteralRule() {
+		return getXNullLiteralAccess().getRule();
+	}
+
+	//XNumberLiteral returns XExpression:
+	//	{XNumberLiteral} value=Number;
+	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
+		return gaXbaseWithAnnotations.getXNumberLiteralAccess();
+	}
+	
+	public ParserRule getXNumberLiteralRule() {
+		return getXNumberLiteralAccess().getRule();
+	}
+
+	//XStringLiteral returns XExpression:
+	//	{XStringLiteral} value=STRING;
+	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
+		return gaXbaseWithAnnotations.getXStringLiteralAccess();
+	}
+	
+	public ParserRule getXStringLiteralRule() {
+		return getXStringLiteralAccess().getRule();
+	}
+
+	//XTypeLiteral returns XExpression:
+	//	{XTypeLiteral} "typeof" "(" type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ")";
+	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
+		return gaXbaseWithAnnotations.getXTypeLiteralAccess();
+	}
+	
+	public ParserRule getXTypeLiteralRule() {
+		return getXTypeLiteralAccess().getRule();
+	}
+
+	//XThrowExpression returns XExpression:
+	//	{XThrowExpression} "throw" expression=XExpression;
+	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
+		return gaXbaseWithAnnotations.getXThrowExpressionAccess();
+	}
+	
+	public ParserRule getXThrowExpressionRule() {
+		return getXThrowExpressionAccess().getRule();
+	}
+
+	//XReturnExpression returns XExpression:
+	//	{XReturnExpression} "return" -> expression=XExpression?;
+	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
+		return gaXbaseWithAnnotations.getXReturnExpressionAccess();
+	}
+	
+	public ParserRule getXReturnExpressionRule() {
+		return getXReturnExpressionAccess().getRule();
+	}
+
+	//XTryCatchFinallyExpression returns XExpression:
+	//	{XTryCatchFinallyExpression} "try" expression=XExpression (catchClauses+=XCatchClause+ ("finally"
+	//	finallyExpression=XExpression)? | "finally" finallyExpression=XExpression);
+	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
+		return gaXbaseWithAnnotations.getXTryCatchFinallyExpressionAccess();
+	}
+	
+	public ParserRule getXTryCatchFinallyExpressionRule() {
+		return getXTryCatchFinallyExpressionAccess().getRule();
+	}
+
+	//XSynchronizedExpression returns XExpression:
+	//	=> ({XSynchronizedExpression} "synchronized" "(") param=XExpression ")" expression=XExpression;
+	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
+		return gaXbaseWithAnnotations.getXSynchronizedExpressionAccess();
+	}
+	
+	public ParserRule getXSynchronizedExpressionRule() {
+		return getXSynchronizedExpressionAccess().getRule();
+	}
+
+	//XCatchClause:
+	//	"catch" "(" declaredParam=FullJvmFormalParameter ")" expression=XExpression;
+	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
+		return gaXbaseWithAnnotations.getXCatchClauseAccess();
+	}
+	
+	public ParserRule getXCatchClauseRule() {
+		return getXCatchClauseAccess().getRule();
+	}
+
+	//Number hidden():
+	//	HEX | (INT | DECIMAL) ("." (INT | DECIMAL))?;
+	public XbaseGrammarAccess.NumberElements getNumberAccess() {
+		return gaXbaseWithAnnotations.getNumberAccess();
+	}
+	
+	public ParserRule getNumberRule() {
+		return getNumberAccess().getRule();
+	}
+
+	/// **
+	// * Dummy rule, for "better" downwards compatibility, since GrammarAccess generates non-static inner classes, 
+	// * which makes downstream grammars break on classloading, when a rule is removed.
+	// * /
+	//StaticQualifier:
+	//	(ValidID "::")+;
+	public XbaseGrammarAccess.StaticQualifierElements getStaticQualifierAccess() {
+		return gaXbaseWithAnnotations.getStaticQualifierAccess();
+	}
+	
+	public ParserRule getStaticQualifierRule() {
+		return getStaticQualifierAccess().getRule();
+	}
+
+	//terminal HEX:
+	//	("0x" | "0X") ("0".."9" | "a".."f" | "A".."F" | "_")+ ("#" (("b" | "B") ("i" | "I") | ("l" | "L")))?;
+	public TerminalRule getHEXRule() {
+		return gaXbaseWithAnnotations.getHEXRule();
+	} 
+
+	//terminal INT returns ecore::EInt:
+	//	"0".."9" ("0".."9" | "_")*;
+	public TerminalRule getINTRule() {
+		return gaXbaseWithAnnotations.getINTRule();
+	} 
+
+	//terminal DECIMAL:
+	//	INT (("e" | "E") ("+" | "-")? INT)? (("b" | "B") ("i" | "I" | "d" | "D") | ("l" | "L" | "d" | "D" | "f" | "F"))?;
+	public TerminalRule getDECIMALRule() {
+		return gaXbaseWithAnnotations.getDECIMALRule();
+	} 
+
+	//JvmTypeReference:
+	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)* |
+	//	XFunctionTypeRef;
+	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
+		return gaXbaseWithAnnotations.getJvmTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmTypeReferenceRule() {
+		return getJvmTypeReferenceAccess().getRule();
+	}
+
+	//ArrayBrackets:
+	//	"[" "]";
+	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
+		return gaXbaseWithAnnotations.getArrayBracketsAccess();
+	}
+	
+	public ParserRule getArrayBracketsRule() {
+		return getArrayBracketsAccess().getRule();
+	}
+
+	//XFunctionTypeRef:
+	//	("(" (paramTypes+=JvmTypeReference ("," paramTypes+=JvmTypeReference)*)? ")")? "=>" returnType=JvmTypeReference;
+	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
+		return gaXbaseWithAnnotations.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 gaXbaseWithAnnotations.getJvmParameterizedTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmParameterizedTypeReferenceRule() {
+		return getJvmParameterizedTypeReferenceAccess().getRule();
+	}
+
+	//JvmArgumentTypeReference returns JvmTypeReference:
+	//	JvmTypeReference | JvmWildcardTypeReference;
+	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
+		return gaXbaseWithAnnotations.getJvmArgumentTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmArgumentTypeReferenceRule() {
+		return getJvmArgumentTypeReferenceAccess().getRule();
+	}
+
+	//JvmWildcardTypeReference:
+	//	{JvmWildcardTypeReference} "?" (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded* |
+	//	constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
+	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
+		return gaXbaseWithAnnotations.getJvmWildcardTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmWildcardTypeReferenceRule() {
+		return getJvmWildcardTypeReferenceAccess().getRule();
+	}
+
+	//JvmUpperBound:
+	//	"extends" typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
+		return gaXbaseWithAnnotations.getJvmUpperBoundAccess();
+	}
+	
+	public ParserRule getJvmUpperBoundRule() {
+		return getJvmUpperBoundAccess().getRule();
+	}
+
+	//JvmUpperBoundAnded returns JvmUpperBound:
+	//	"&" typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
+		return gaXbaseWithAnnotations.getJvmUpperBoundAndedAccess();
+	}
+	
+	public ParserRule getJvmUpperBoundAndedRule() {
+		return getJvmUpperBoundAndedAccess().getRule();
+	}
+
+	//JvmLowerBound:
+	//	"super" typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
+		return gaXbaseWithAnnotations.getJvmLowerBoundAccess();
+	}
+	
+	public ParserRule getJvmLowerBoundRule() {
+		return getJvmLowerBoundAccess().getRule();
+	}
+
+	//JvmLowerBoundAnded returns JvmLowerBound:
+	//	"&" typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
+		return gaXbaseWithAnnotations.getJvmLowerBoundAndedAccess();
+	}
+	
+	public ParserRule getJvmLowerBoundAndedRule() {
+		return getJvmLowerBoundAndedAccess().getRule();
+	}
+
+	//JvmTypeParameter:
+	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
+	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
+		return gaXbaseWithAnnotations.getJvmTypeParameterAccess();
+	}
+	
+	public ParserRule getJvmTypeParameterRule() {
+		return getJvmTypeParameterAccess().getRule();
+	}
+
+	//QualifiedNameWithWildcard:
+	//	QualifiedName "." "*";
+	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
+		return gaXbaseWithAnnotations.getQualifiedNameWithWildcardAccess();
+	}
+	
+	public ParserRule getQualifiedNameWithWildcardRule() {
+		return getQualifiedNameWithWildcardAccess().getRule();
+	}
+
+	//XImportSection:
+	//	importDeclarations+=XImportDeclaration+;
+	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
+		return gaXbaseWithAnnotations.getXImportSectionAccess();
+	}
+	
+	public ParserRule getXImportSectionRule() {
+		return getXImportSectionAccess().getRule();
+	}
+
+	//XImportDeclaration:
+	//	"import" (static?="static" extension?="extension"? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
+	//	(wildcard?="*" | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
+	//	importedNamespace=QualifiedNameWithWildcard) ";"?;
+	public XtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
+		return gaXbaseWithAnnotations.getXImportDeclarationAccess();
+	}
+	
+	public ParserRule getXImportDeclarationRule() {
+		return getXImportDeclarationAccess().getRule();
+	}
+
+	//QualifiedNameInStaticImport:
+	//	(ValidID ".")+;
+	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
+		return gaXbaseWithAnnotations.getQualifiedNameInStaticImportAccess();
+	}
+	
+	public ParserRule getQualifiedNameInStaticImportRule() {
+		return getQualifiedNameInStaticImportAccess().getRule();
+	}
+
+	//terminal ID:
+	//	"^"? ("a".."z" | "A".."Z" | "$" | "_") ("a".."z" | "A".."Z" | "$" | "_" | "0".."9")*;
+	public TerminalRule getIDRule() {
+		return gaXbaseWithAnnotations.getIDRule();
+	} 
+
+	//terminal STRING:
+	//	"\"" ("\\" . / * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\""))* "\""? | "\'" ("\\" .
+	//	/ * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\'"))* "\'"?;
+	public TerminalRule getSTRINGRule() {
+		return gaXbaseWithAnnotations.getSTRINGRule();
+	} 
+
+	//terminal ML_COMMENT:
+	//	"/ *"->"* /";
+	public TerminalRule getML_COMMENTRule() {
+		return gaXbaseWithAnnotations.getML_COMMENTRule();
+	} 
+
+	//terminal SL_COMMENT:
+	//	"//" !("\n" | "\r")* ("\r"? "\n")?;
+	public TerminalRule getSL_COMMENTRule() {
+		return gaXbaseWithAnnotations.getSL_COMMENTRule();
+	} 
+
+	//terminal WS:
+	//	(" " | "\t" | "\r" | "\n")+;
+	public TerminalRule getWSRule() {
+		return gaXbaseWithAnnotations.getWSRule();
+	} 
+
+	//terminal ANY_OTHER:
+	//	.;
+	public TerminalRule getANY_OTHERRule() {
+		return gaXbaseWithAnnotations.getANY_OTHERRule();
+	} 
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/validation/AbstractStatemachineDSLValidator.java b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/validation/AbstractStatemachineDSLValidator.java
new file mode 100644
index 0000000..01dd6c8
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src-gen/org/eclipse/osbp/xtext/statemachine/validation/AbstractStatemachineDSLValidator.java
@@ -0,0 +1,33 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.emf.ecore.EPackage;
+
+public class AbstractStatemachineDSLValidator extends org.eclipse.xtext.xbase.annotations.validation.XbaseWithAnnotationsValidator {
+
+	@Override
+	protected List<EPackage> getEPackages() {
+	    List<EPackage> result = new ArrayList<EPackage>(super.getEPackages());
+	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/xtext/statemachine/StatemachineDSL"));
+	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/dsl/common/types/v1"));
+	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/Xtext/Xbase/XAnnotations"));
+	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xbase"));
+	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/common/JavaVMTypes"));
+	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xtype"));
+		return result;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/Activator.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/Activator.java
new file mode 100644
index 0000000..89ccbd5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/Activator.java
@@ -0,0 +1,47 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ */
+ package org.eclipse.osbp.xtext.statemachine;
+
+
+import org.eclipse.osbp.gitinfo.Loginfo;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+	private static BundleContext context;
+
+	static BundleContext getContext() {
+		return context;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext bundleContext) throws Exception {
+		Activator.context = bundleContext;
+		Loginfo li = new Loginfo();
+		li.print( Activator.class.getCanonicalName(), Activator.class.getClassLoader());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext bundleContext) throws Exception {
+		Activator.context = null;
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/GenerateStatemachineDSL.mwe2 b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/GenerateStatemachineDSL.mwe2
new file mode 100644
index 0000000..a42f7f0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/GenerateStatemachineDSL.mwe2
@@ -0,0 +1,175 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine.GenerateStatemachineDSL
+
+import org.eclipse.emf.mwe.utils.*
+import org.eclipse.xtext.generator.*
+import org.eclipse.xtext.ui.generator.*
+import org.eclipse.osbp.dsl.mwe.*
+
+var projectName = "org.eclipse.osbp.xtext.statemachine"
+var grammarURI = "platform:/resource/${projectName}/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSL.xtext"
+var fileExtensions = "statemachine"
+var runtimeProject = "../${projectName}"
+var generateXtendStub = true
+var encoding = "UTF-8"
+
+Workflow {
+	bean = org.eclipse.emf.ecore.xcore.XcoreStandaloneSetup : xcore {}
+	bean = org.eclipse.xtext.mwe.Reader {
+		register = xcore
+	} 
+	
+	bean = MavenStandaloneSetup {
+		
+		scanClassPath = true
+		platformUri = "${runtimeProject}/.."
+		
+		registerGenModelFile = "platform:/resource/org.eclipse.osbp.xtext.statemachine/model/StatemachineDSL.xcore"
+		registerGeneratedEPackage = "org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage"
+		
+		registerEcoreFile = "platform:/resource/org.eclipse.osbp.dsl.dto.xtext/model/dto.xcore"
+
+		registerGenModelFile = "platform:/resource/org.eclipse.osbp.xtext.functionlibrarydsl/model/FunctionLibraryDSL.xcore"
+		registerGeneratedEPackage = "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDSLPackage"
+
+		registerGenModelFile = "platform:/resource/org.eclipse.osbp.xtext.reportdsl/model/ReportDSL.xcore"
+		registerGeneratedEPackage = "org.eclipse.osbp.xtext.reportdsl.ReportDSLPackage"
+
+		registerGenModelFile = "platform:/resource/org.eclipse.osbp.dsl.entity.xtext/model/entity.xcore"
+		registerGeneratedEPackage = "org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage"
+		registerGenModelFile = "platform:/resource/org.eclipse.osbp.dsl.common.xtext/model/types.xcore"
+		registerGeneratedEPackage = "org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage"
+
+		registerGenModelFile = "platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.genmodel"
+		registerEcoreFile = "platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.ecore"
+
+		registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel"
+		registerEcoreFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xtype.ecore"
+		registerEcoreFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.ecore"
+		registerEcoreFile = "platform:/resource/org.eclipse.xtext.xbase/model/XAnnotations.ecore"
+	}
+    
+    component = DirectoryCleaner {
+        directory = "${runtimeProject}/src-gen"
+    	exclude = "README.txt"
+    }
+    
+    component = DirectoryCleaner {
+        directory = "${runtimeProject}.ui/src-gen"
+    	exclude = "README.txt"
+    }
+    
+    component = Generator {
+        pathRtProject = runtimeProject
+        pathUiProject = "${runtimeProject}.ui"
+        pathTestProject = "${runtimeProject}.tests"
+        projectNameRt = projectName
+        projectNameUi = "${projectName}.ui"
+		encoding = encoding
+    	language = auto-inject {
+    		uri = grammarURI
+    
+    		// Java API to access grammar elements (required by several other fragments)
+    		fragment = grammarAccess.GrammarAccessFragment auto-inject {}
+    
+    		// generates Java API for the generated EPackages
+    		fragment = ecore.EMFGeneratorFragment auto-inject {}
+    
+    		// the old serialization component
+    		// fragment = parseTreeConstructor.ParseTreeConstructorFragment auto-inject {}    
+    
+    		// serializer 2.0
+    		fragment = serializer.SerializerFragment auto-inject {
+    			generateStub = false
+    		}
+    
+    		// a custom ResourceFactory for use with EMF
+    		fragment = resourceFactory.ResourceFactoryFragment auto-inject {}
+    
+    		// The antlr parser generator fragment.
+    		fragment = parser.antlr.XtextAntlrGeneratorFragment auto-inject {
+    		//  options = {
+    		//      backtrack = true
+    		//  }
+    		}
+    
+    		// Xtend-based API for validation
+    		fragment = validation.ValidatorFragment auto-inject {
+    		//    composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
+    		//    composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+    		}
+    
+    		// old scoping and exporting API
+    		// fragment = scoping.ImportURIScopingFragment auto-inject {}
+    		// fragment = exporting.SimpleNamesFragment auto-inject {}
+    
+    		// scoping and exporting API
+    		fragment = scoping.ImportNamespacesScopingFragment auto-inject {}
+    		fragment = exporting.QualifiedNamesFragment auto-inject {}
+    		fragment = builder.BuilderIntegrationFragment auto-inject {}
+    
+    		// generator API
+    		fragment = generator.GeneratorFragment auto-inject {}
+    
+    		// formatter API
+    		fragment = formatting.FormatterFragment auto-inject {}
+    
+    		// labeling API
+    		fragment = labeling.LabelProviderFragment auto-inject {}
+    
+    		// outline API
+    		fragment = outline.OutlineTreeProviderFragment auto-inject {}
+    		fragment = outline.QuickOutlineFragment auto-inject {}
+    
+    		// quickfix API
+    		fragment = quickfix.QuickfixProviderFragment auto-inject {}
+    
+    		// content assist API
+    		fragment = contentAssist.ContentAssistFragment auto-inject {}
+    
+    		// generates a more lightweight Antlr parser and lexer tailored for content assist
+			fragment = parser.antlr.XtextAntlrUiGeneratorFragment auto-inject {
+				// @see https://github.com/osbp/osbp-doc/blob/master/org.eclipse.osbp.doc.dsl/src/org.eclipse.osbp/doc/dsl/grammar/GenerateOSBPDocGrammar.mwe2
+    		  	options = {
+    		//      backtrack = true
+    				classSplitting=true
+    				fieldsPerClass="100"
+    				methodsPerClass="100"
+    		  	}
+    		}
+    
+    		// generates junit test support classes into Generator#pathTestProject
+    		fragment = junit.Junit4Fragment auto-inject {}
+    
+    		// rename refactoring
+    		fragment = refactoring.RefactorElementNameFragment auto-inject {}
+    
+    		// provides the necessary bindings for java types integration
+    		fragment = types.TypesGeneratorFragment auto-inject {}
+    
+    		// generates the required bindings only if the grammar inherits from Xbase
+    		fragment = xbase.XbaseGeneratorFragment auto-inject {}
+    
+    		// provides a preference page for template proposals
+    		fragment = templates.CodetemplatesGeneratorFragment auto-inject {}
+    
+    		// provides a compare view
+    		fragment = compare.CompareFragment auto-inject {}
+    		
+    		// parse grammar and generate i18n grammar
+            fragment = org.eclipse.osbp.xtext.basic.generator.BasicDslGrammarI18nGenerator auto-inject {}
+    	}
+    }
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSL.xtext b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSL.xtext
new file mode 100644
index 0000000..9bb4c36
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSL.xtext
@@ -0,0 +1,529 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2015 - 2017 - 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
+ * 	   Jörg Riegel - ongoing development
+ * 
+ */
+grammar org.eclipse.osbp.xtext.statemachine.StatemachineDSL
+with org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations
+
+import "http://osbp.eclipse.org/xtext/statemachine/StatemachineDSL"
+import "http://osbp.eclipse.org/dsl/dto/v1" as dto
+import "http://osbp.eclipse.org/xtext/functionlibrarydsl/FunctionLibraryDSL" as function
+import "http://osbp.eclipse.org/xtext/reportdsl/ReportDSL" as report
+import "http://osbp.eclipse.org/dsl/common/types/v1" as types
+import "http://www.eclipse.org/emf/2002/Ecore" as ecore
+
+StatemachineModel:
+	packages+=StatemachinePackage*;
+
+StatemachinePackage:
+	{StatemachinePackage} 'package' name=QualifiedName
+	('{' (imports+=StatemachineImport)* (statemachines+=Statemachine)* '}')?;
+
+Statemachine:
+	'statemachine' name=ID (description?='described by' descriptionValue=TRANSLATABLESTRING)?
+	('functiongroup' functionGroup=[function::FunctionLibraryStatemachineGroup])?
+	'initialState' initialState=[StatemachineState]
+	'initialEvent' initialEvent=[StatemachineEvent]
+	('events' ('{'
+	(events+=StatemachineEvent)*
+	'}'))
+	('controls' '{'
+	(controls+=StatemachineControl)*
+	'}')
+	('states' '{'
+	(states+=StatemachineState)*
+	'}');
+
+StatemachineEvent:
+	'event' name=ID;
+
+StatemachineState:
+	'state' name=ID
+	'{'
+	(('triggers' '{' (triggers+=StatemachineTrigger)* '}')? &
+	('identity' identity=StatemachineOperation)? &
+	('keystroke' '@' keystroke=[StatemachineControlFieldAttribute] (hasKeyOperation?='and' keyOperation=StatemachineOperation)?)?)
+	'}';
+
+StatemachineTrigger:
+	{StatemachineTrigger}
+	'trigger' (triggers+=[StatemachineEvent])* 
+	('guards' '{' (guards+=StatemachineGuard)* '}')?
+	'actions' (hasTransition?='transition' transition=[StatemachineState])? '{' (actions+=StatemachineAction)* '}';
+
+StatemachineAction:
+	StatemachineActionPeripheralBlinkRate| 
+	StatemachineActionPeripheralClear|
+	StatemachineActionPeripheralCreateWindow|
+	StatemachineActionPeripheralCursorType|
+	StatemachineActionPeripheralDestroyWindow|
+	StatemachineActionPeripheralDeviceBrightness|
+	StatemachineActionPeripheralDisplayBitmap|
+	StatemachineActionPeripheralDisplayText|
+	StatemachineActionPeripheralDisplayTextAt|
+	StatemachineActionPeripheralInterCharacterWait|
+	StatemachineActionPeripheralMarqueeFormat|
+	StatemachineActionPeripheralMarqueeRepeatWait|
+	StatemachineActionPeripheralMarqueeType|
+	StatemachineActionPeripheralMarqueeUnitWait|
+	StatemachineActionPeripheralScroll|
+	StatemachineActionPeripheralOpenDrawer|
+	StatemachineActionPeripheralPrintBarcode|
+	StatemachineActionPeripheralPrintBitmap|
+	StatemachineActionPeripheralPrintCut|
+	StatemachineActionPeripheralPrintNormal|
+	StatemachineActionPeripheralPrintRegisterBitmap|
+	StatemachineActionPeripheralPTOpen|
+	StatemachineActionPeripheralPTClose|
+	StatemachineActionPeripheralPTAcknowledge|
+//	StatemachineActionPeripheralPTPrepaidTopUp|
+	StatemachineActionPeripheralPTReversal|
+	StatemachineActionPeripheralPTRegistration|
+	StatemachineActionPeripheralPTAuthorization|
+	StatemachineActionPeripheralPrintReport|
+	StatemachineActionFieldSet|
+	StatemachineActionFieldRemove|
+	StatemachineActionItemVisible|
+	StatemachineActionItemInvisible|
+	StatemachineActionFieldClear|
+	StatemachineActionButtonCaption|
+	StatemachineActionButtonImage|
+	StatemachineActionDTOFind|
+	StatemachineStorage|
+	StatemachineActionScheduler|
+	StatemachineOperation|
+	StatemachineActionConditionalTransition;
+// peripherals
+//lineDisplay
+StatemachineActionPeripheralBlinkRate:
+	'blinkRate' blinkRate=INT '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralClear:
+	'clearDevice' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralCreateWindow:
+	'createWindow' 
+	'row' viewportRow=INT
+	'column' viewportColumn=INT
+	'height' viewportHeight=INT
+	'width' viewportWidth=INT
+	'windowHeight' windowHeight=INT
+	'windowWidth' windowWidth=INT
+	'@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralCursorType:
+	'cursorType' cursorType=StatemachineLineDisplayCursorType '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralDestroyWindow:
+	'destroyWindow' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralDeviceBrightness:
+	'deviceBrightness' brightness=INT '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralDisplayBitmap:
+	'displayBitmap' 'id' bitmapId=INT '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralDisplayText:
+	'displayText' 'text' text=StatemachineActionFieldConcatenation (hasType?='type' textType=StatemachineLineDisplayTextType)? '@' device=[StatemachinePeripheralDeviceLineDisplay] ;
+StatemachineActionPeripheralDisplayTextAt:
+	'displayTextAt' 'text' text=StatemachineActionFieldConcatenation 'row' row=INT 'column' column=INT (hasType?='type' textType=StatemachineLineDisplayTextType)? '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralInterCharacterWait:
+	'interCharacterWait' wait=INT '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralMarqueeFormat:
+	'marqueeFormat' format=StatemachineLineDisplayMarqueeFormat '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralMarqueeRepeatWait:
+	'marqueeRepeatWait' wait=INT '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralMarqueeType:
+	'marqueeType' marqueeType=StatemachineLineDisplayMarqueeType '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralMarqueeUnitWait:	
+	'marqueeUnitWait' wait=INT '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralScroll:	
+	'scroll' direction=StatemachineLineDisplayScrollTextType units=INT '@' device=[StatemachinePeripheralDeviceLineDisplay];
+StatemachineActionPeripheralOpenDrawer:				 
+	'openDrawer' device=[StatemachinePeripheralDeviceCashDrawer];
+StatemachineActionPeripheralPrintBarcode:			
+	'printBarcode' 'data' data=STRING 'barcodeType' barcodeType=StatemachinePOSPrinterBarcodeType '@' device=[StatemachinePeripheralDevicePOSPrinter];
+StatemachineActionPeripheralPrintBitmap:
+	'printBitmap' 'id' bitmapId=INT '@' device=[StatemachinePeripheralDevicePOSPrinter];
+StatemachineActionPeripheralPrintCut:
+	'printCut' 'text' text=StatemachineActionFieldConcatenation '@' device=[StatemachinePeripheralDevicePOSPrinter];
+StatemachineActionPeripheralPrintNormal:
+	'printNormal' 'text' text=StatemachineActionFieldConcatenation '@' device=[StatemachinePeripheralDevicePOSPrinter];
+StatemachineActionPeripheralPrintRegisterBitmap:
+	'registerBitmap' 'id' bitmapId=INT 'name' name=STRING '@' device=[StatemachinePeripheralDevicePOSPrinter];
+StatemachineActionPeripheralPTOpen:
+	'paymentOpen' 'host' host=StatemachineActionFieldConcatenation 'port' port=StatemachineActionFieldConcatenation '@' device=[StatemachinePeripheralDevicePT];
+StatemachineActionPeripheralPTClose:
+	'paymentClose' '@' device=[StatemachinePeripheralDevicePT];
+StatemachineActionPeripheralPTAcknowledge:
+	'paymentAcknowledge' '@' device=[StatemachinePeripheralDevicePT];
+//StatemachineActionPeripheralPTBalanceRequest:
+//	'balanceRequest' '@' device=[StatemachinePeripheralDevicePT];
+//StatemachineActionPeripheralPTPrepaidTopUp:
+//	'prepaidTopUp' 'of' source=StatemachineActionFieldConcatenation '@' device=[StatemachinePeripheralDevicePT];
+StatemachineActionPeripheralPTReversal:
+	'paymentReversal' 'withPassword' password=StatemachineActionFieldConcatenation 'ofReceipt' receipt=StatemachineActionFieldConcatenation '@' device=[StatemachinePeripheralDevicePT];
+StatemachineActionPeripheralPTRegistration:
+	'paymentRegistration' 'withPassword' password=StatemachineActionFieldConcatenation 'configuration' configuration=STRING '@' device=[StatemachinePeripheralDevicePT];
+StatemachineActionPeripheralPTAuthorization:
+	'paymentAuthorization' 'ofAmount' amount=StatemachineActionFieldConcatenation '@' device=[StatemachinePeripheralDevicePT];
+StatemachineActionPeripheralPTResponse:
+	'paymentResponse' 'from' device=[StatemachinePeripheralDevicePT];
+StatemachineActionPeripheralPrintReport:
+	'printReport' report=[report::Report] (hasFilter?='from' key=[StatemachineStorage])?;
+// fields
+StatemachineActionFieldSource:
+	StatemachineActionFieldSourceString|
+	StatemachineActionFieldSourceNumber|
+	StatemachineActionFieldSourceEvaluate|
+	StatemachineActionFieldSourceTranslate|
+	StatemachineActionFieldGet|
+	StatemachineFunction|
+	StatemachineStorageRetrieve|
+	StatemachineActionFieldSourceDtoAttribute|
+	StatemachineActionFieldSourceEvent|
+	StatemachineActionPeripheralPTResponse;
+
+StatemachineOperation:
+	'operation' operation=[function::FunctionLibraryOperation] 
+	'(' (first=StatemachineOperationParameter)? (more+=StatemachineOperationParameterMore)* ')';
+	
+StatemachineGuard:
+	'guard' guard = [function::FunctionLibraryGuard]
+	(hasOnFail?='onFail' 'caption' onFailCaption=TRANSLATABLESTRING 
+	'description' onFailDescription=TRANSLATABLESTRING 'type' onFailType=StatemachineUserMessageType)?;
+	
+StatemachineFunction:
+	'function' function=[function::FunctionLibraryFunction] 
+	'(' (first=StatemachineOperationParameter)? (more+=StatemachineOperationParameterMore)* ')';
+	
+StatemachineStorage:
+	'store' content=StatemachineActionFieldConcatenation 'with' key=ID '.' attribute=ID;
+	
+StatemachineStorageRetrieve:
+	'retrieve' 'from' key=ID '.' attribute=ID;
+	
+StatemachineActionConditionalTransition:
+	'transition' transition=[StatemachineState] guard=StatemachineGuard '{' (actions+=StatemachineAction)* '}';
+	
+StatemachineActionFieldSourceString:
+	text=STRING;
+	
+StatemachineActionFieldSourceNumber:
+	value=SignedNumber;
+	
+StatemachineActionFieldSourceEvaluate:
+	evaluationtype=StatemachineEvaluationType;
+	
+StatemachineActionFieldSourceEvent:
+	{StatemachineActionFieldSourceEvent} 'event';
+	
+StatemachineActionFieldSourceTranslate:
+	'translate' text=TRANSLATABLESTRING;
+
+StatemachineActionFieldSourceDtoAttribute:
+	'dto' dto=[StatemachineControlDTOAttribute]'.'attribute=[dto::LDtoInheritedAttribute];
+	
+StatemachineActionFieldSourceMore returns StatemachineActionFieldSource:
+	StatemachineActionFieldSourceStringMore|
+	StatemachineActionFieldSourceNumberMore|
+	StatemachineActionFieldSourceEvaluateMore|
+	StatemachineActionFieldSourceTranslateMore|
+	StatemachineActionFieldGetMore|
+	StatemachineOperationMore|
+	StatemachineStorageRetrieveMore|
+	StatemachineActionFieldSourceDtoAttributeMore;
+
+StatemachineActionFieldSourceStringMore returns StatemachineActionFieldSourceString:
+	{StatemachineActionFieldSourceString} '+' text=STRING;
+	
+StatemachineActionFieldSourceNumberMore returns StatemachineActionFieldSourceNumber:
+	{StatemachineActionFieldSourceNumber} '+' value=SignedNumber;
+	
+StatemachineActionFieldSourceEvaluateMore returns StatemachineActionFieldSourceEvaluate:
+	{StatemachineActionFieldSourceEvaluate} '+' evaluationtype=StatemachineEvaluationType;
+	
+StatemachineActionFieldSourceTranslateMore returns StatemachineActionFieldSourceTranslate:
+	{StatemachineActionFieldSourceTranslate} '+' 'translate' text=TRANSLATABLESTRING;
+
+StatemachineActionFieldGetMore returns StatemachineActionFieldGet:
+	{StatemachineActionFieldGet} '+' 'get' attribute=[StatemachineControlFieldAttribute];
+
+StatemachineOperationMore returns StatemachineOperation:
+	{StatemachineOperation} '+' 'operation' operation=[function::FunctionLibraryOperation];
+
+StatemachineStorageRetrieveMore returns StatemachineStorageRetrieve:
+	{StatemachineStorageRetrieve} '+' 'retrieve' 'from' key=ID '.' attribute=ID;
+
+StatemachineActionFieldSourceDtoAttributeMore returns StatemachineActionFieldSourceDtoAttribute:
+	{StatemachineActionFieldSourceDtoAttribute} '+' 'dto' dto=[StatemachineControlDTOAttribute]'.'attribute=[dto::LDtoInheritedAttribute];
+
+StatemachineActionFieldConcatenation:
+	first=StatemachineActionFieldSource (more+=StatemachineActionFieldSourceMore)*;
+	
+StatemachineOperationParameter:
+	source=StatemachineActionFieldConcatenation;
+	
+StatemachineOperationParameterMore returns StatemachineOperationParameter:
+	{StatemachineOperationParameter} ',' source=StatemachineActionFieldConcatenation;
+
+StatemachineActionFieldSet:
+	'set' source=StatemachineActionFieldConcatenation '@' attribute=[StatemachineControlFieldAttribute];
+	
+StatemachineActionFieldClear:
+	'clear' attribute=[StatemachineControlFieldAttribute];
+	
+StatemachineActionFieldGet:
+	'get' attribute=[StatemachineControlFieldAttribute];
+	
+StatemachineActionFieldRemove:
+	'remove' attribute=[StatemachineControlFieldAttribute];
+	
+StatemachineControlVisibility:
+	StatemachineControlFieldAttribute|
+	StatemachineControlFieldLayout|
+	StatemachineControlButtonAttribute|
+	StatemachineControlButton;
+	
+StatemachineActionItemVisible:
+	'visible' attribute=[StatemachineControlVisibility];
+	
+StatemachineActionItemInvisible:
+	'invisible' attribute=[StatemachineControlVisibility];
+	
+// buttons
+StatemachineActionButtonCaption:
+	'caption' caption=StatemachineActionFieldConcatenation '@' attribute=[StatemachineControlButtonAttribute];
+	
+StatemachineActionButtonImage:
+	'image' image=STRING '@' attribute=[StatemachineControlButtonAttribute];
+	
+// dto
+StatemachineActionDTOFind:
+	'search' search=StatemachineActionFieldConcatenation
+	'in' dto=[StatemachineControlDTOAttribute]'.'attribute=[dto::LDtoInheritedAttribute];
+
+StatemachineActionScheduler:
+	'schedule' scheduler=[StatemachineControlSchedulerAttribute];
+
+StatemachineControl:
+	StatemachineControlButton|StatemachineControlField|StatemachineControlDTO|StatemachineControlScheduler|StatemachineControlPeripheral;
+	
+StatemachineControlButton:
+	'keypad' name=ID 'event' eventType=StatemachineControlButtonEventType '{'
+	(buttons+=StatemachineControlButtonAttribute)*
+	'}';
+
+StatemachineControlField:
+	'fields' name=ID '{'
+	((fields+=StatemachineControlFieldAttribute)* &
+	(layouts+=StatemachineControlFieldLayout)*)
+	'}';
+
+StatemachineControlDTO:
+	'dataProvider' name=ID '{'
+	(dtos+=StatemachineControlDTOAttribute)*
+	'}';
+
+StatemachineControlScheduler:
+	'scheduler' name=ID '{'
+	(schedulers+=StatemachineControlSchedulerAttribute)*
+	'}';
+
+StatemachinePeripheralDeviceLineDisplay:
+	'lineDisplay' name=ID;
+
+StatemachinePeripheralDevicePOSPrinter:
+	'posPrinter' name=ID;
+
+StatemachinePeripheralDeviceCashDrawer:
+	'cashDrawer' name=ID;
+	
+StatemachinePeripheralDevicePT:
+	'payment' name=ID;
+	
+StatemachineControlPeripheral:
+	'peripheral' name=ID '{'
+	(lineDisplays+=StatemachinePeripheralDeviceLineDisplay)*
+	(posPrinters+=StatemachinePeripheralDevicePOSPrinter)*
+	(cashDrawers+=StatemachinePeripheralDeviceCashDrawer)*
+	(paymentTerminals+=StatemachinePeripheralDevicePT)*
+	'}';
+
+StatemachineControlButtonAttribute:
+	'button' name=TRANSLATABLEID
+	(hasImage?='image' image=STRING)?
+	event=StatemachineControlButtonAttributeEvent;
+
+StatemachineControlButtonAttributeEvent:
+	StatemachineControlButtonAttributeEventKeyboard|
+	StatemachineControlButtonAttributeEventIdentity|
+	StatemachineControlButtonAttributeEventEvent;
+
+StatemachineControlButtonAttributeEventKeyboard:
+	{StatemachineControlButtonAttributeEventKeyboard} 'key' keystroke=STRING;
+	
+StatemachineControlButtonAttributeEventIdentity:
+	{StatemachineControlButtonAttributeEventIdentity} 'id' identity=INT;
+	
+StatemachineControlButtonAttributeEventEvent:
+	{StatemachineControlButtonAttributeEventEvent} 'event' event=[StatemachineEvent];
+
+StatemachineControlFieldAttribute:
+	'field' name=TRANSLATABLEID
+	'type' attributeType=StatemachineFieldType;
+
+StatemachineControlFieldLayout:
+	'layout' name=ID;
+	
+StatemachineControlDTOAttribute:
+	'dto' name=ID
+	'type' attributeType=StatemachineDTOType
+	(hasEvent?='event' event=[StatemachineEvent])?;
+
+StatemachineControlSchedulerAttribute:
+	'scheduler' name=ID
+	'delay' delay=INT
+	'send' event=[StatemachineEvent];
+
+StatemachineDTOType:
+	attributeType=[dto::LDto];
+
+StatemachineFieldType:
+	attributeType=StatemachineInternalType;
+
+enum StatemachineInternalType:
+	BOOLEAN		= 'Boolean'| 
+	INTEGER		= 'Integer'| 
+	LONG		= 'Long'|
+	DOUBLE		= 'Double'|
+	STRING		= 'String'| 
+	DATE		= 'Date'| 
+	SUGGESTTEXT	= 'SuggestText'; 
+
+enum StatemachineControlButtonEventType:
+	KEYBOARD= 'keyboard'|
+	TRIGGER	= 'trigger'|
+	IDENTITY= 'identity';
+
+enum StatemachineEvaluationType:
+	IP_ADDRESS 		= 'getIPAddress'|
+	NOW 			= 'getNow'|
+	USER_AGENT_INFO = 'getUserAgentInfo'|
+	IS_TOUCH_DEVICE = 'isTouchDevice'|
+	IS_HTTPS 		= 'isHttps'|
+	BROWSER_LOCALE 	= 'getBrowserLocale'|
+	USER_NAME		= 'getUserName'|
+	USER_PASSWORD	= 'getUserPassword'|
+	USER_EMAIL		= 'getUserEmail'|
+	USER_POSITION	= 'getUserPosition'|
+	USER_PRTSERVICE	= 'getUserPrintService'|
+	SCREEN_WIDTH 	= 'getSceenWidth'|
+	SCREEN_HEIGHT 	= 'getScreenHeight'|
+	TRIGGER			= 'getTrigger';
+
+enum StatemachineUserMessageType:
+	HUMANIZED_MESSAGE		= 'humanized'|
+	WARNING_MESSAGE			= 'warning'|
+	ERROR_MESSAGE			= 'error'|
+	TRAY_NOTIFICATION		= 'tray'|
+	ASSISTIVE_NOTIFICATION	= 'assistive';
+
+enum StatemachineLineDisplayCursorType:
+	DISP_CT_NONE		= 'none'|     
+	DISP_CT_FIXED    	= 'fixed'|
+	DISP_CT_BLOCK    	= 'block'|
+	DISP_CT_HALFBLOCK	= 'halfblock'|
+	DISP_CT_UNDERLINE	= 'underline'|
+	DISP_CT_REVERSE  	= 'reverse'|
+	DISP_CT_OTHER    	= 'other'|
+	DISP_CT_BLINK		= 'blink';
+
+enum StatemachineLineDisplayMarqueeType:
+	DISP_MT_NONE         = 'none'|
+	DISP_MT_UP           = 'up'|
+	DISP_MT_DOWN         = 'down'|
+	DISP_MT_LEFT         = 'left'|
+	DISP_MT_RIGHT        = 'right'|
+	DISP_MT_INIT         = 'init';
+
+enum StatemachineLineDisplayMarqueeFormat:
+	DISP_MF_WALK         = 'walk'|
+	DISP_MF_PLACE        = 'place';
+
+enum StatemachineLineDisplayTextType:
+	DISP_DT_NORMAL        = 'normal'|
+	DISP_DT_BLINK         = 'blink'|
+	DISP_DT_REVERSE       = 'reverse'|
+	DISP_DT_BLINK_REVERSE = 'blinkreverse';
+
+enum StatemachineLineDisplayScrollTextType:
+	DISP_ST_UP           = 'up'|
+	DISP_ST_DOWN         = 'down'|
+	DISP_ST_LEFT         = 'left'|
+	DISP_ST_RIGHT        = 'right';
+
+enum StatemachinePOSPrinterBarcodeType:
+	PTR_BCS_UPCA           = 'upca'|
+	PTR_BCS_UPCE           = 'upcb'|
+	PTR_BCS_JAN8           = 'jan8'|
+	PTR_BCS_EAN8           = 'ean8'|
+	PTR_BCS_JAN13          = 'jan13'|
+	PTR_BCS_EAN13          = 'ean13'|
+	PTR_BCS_TF             = 'tf'|
+	PTR_BCS_ITF            = 'itf'|
+	PTR_BCS_Codabar        = 'codeabar'|
+	PTR_BCS_Code39         = 'code39'|
+	PTR_BCS_Code93         = 'code93'|
+	PTR_BCS_Code128        = 'code128'|
+	PTR_BCS_UPCA_S         = 'upca_s'|
+	PTR_BCS_UPCE_S         = 'upce_s'|
+	PTR_BCS_UPCD1          = 'upcd1'|
+	PTR_BCS_UPCD2          = 'upcd2'|
+	PTR_BCS_UPCD3          = 'upcd3'|
+	PTR_BCS_UPCD4          = 'upcd4'|
+	PTR_BCS_UPCD5          = 'upcd5'|
+	PTR_BCS_EAN8_S         = 'ean8_s'|
+	PTR_BCS_EAN13_S        = 'ean13_s'|
+	PTR_BCS_EAN128         = 'ean128'|
+	PTR_BCS_OCRA           = 'orca'|
+	PTR_BCS_OCRB           = 'ocrb'|
+	PTR_BCS_Code128_Parsed = 'code128_parsed'|
+	PTR_BCS_GS1DATABAR     = 'gs1databar'|
+	PTR_BCS_GS1DATABAR_E   = 'gs1databar_e'|
+	PTR_BCS_GS1DATABAR_S   = 'gs1databar_s'|
+	PTR_BCS_GS1DATABAR_E_S = 'gs1databar_e_s'|
+	PTR_BCS_PDF417         = 'pdf417'|
+	PTR_BCS_MAXICODE       = 'maxicode'|
+	PTR_BCS_DATAMATRIX     = 'datamatrix'|
+	PTR_BCS_QRCODE         = 'qrcode'|
+	PTR_BCS_UQRCODE        = 'uqrcode'|
+	PTR_BCS_AZTEC          = 'aztec'|
+	PTR_BCS_UPDF417        = 'updf417';
+
+StatemachineImport returns types::LImport:
+	'import' importedNamespace=StatemachineQualifiedNameWithWildCard;
+
+StatemachineQualifiedNameWithWildCard:
+	QualifiedName ('.' '*')?;
+
+QualifiedName:
+	ValidID (=> '.' ValidID)*;
+
+ValidID:
+	ID;
+
+TRANSLATABLESTRING:
+	STRING;
+	
+TRANSLATABLEID:
+	ID;
+
+SignedNumber returns ecore::EDouble:
+	('-')? UnsignedNumber;
+
+UnsignedNumber returns ecore::EDouble:
+	INT ('.' (INT))?;
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLBundleSpaceRuntimeModule.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLBundleSpaceRuntimeModule.java
new file mode 100644
index 0000000..9ee1b7b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLBundleSpaceRuntimeModule.java
@@ -0,0 +1,49 @@
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.osbp.dsl.xtext.types.bundles.BundleSpaceTypeProviderFactory;
+import org.eclipse.osbp.dsl.xtext.types.bundles.BundleSpaceTypeScopeProvider;
+import org.eclipse.osbp.xtext.builder.types.loader.api.ITypeLoaderFactory;
+import org.eclipse.osbp.xtext.builder.types.loader.api.ITypeLoaderProvider;
+import org.eclipse.osbp.xtext.builder.types.loader.runtime.TypeLoaderFactory;
+import org.eclipse.osbp.xtext.builder.types.loader.runtime.TypeLoaderProvider;
+
+@SuppressWarnings("restriction")
+public class StatemachineDSLBundleSpaceRuntimeModule extends
+		StatemachineDSLRuntimeModule {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.xtext.datamartdsl.AbstractDatamartDSLRuntimeModule#bindIJvmTypeProvider$Factory()
+	 */
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.access.IJvmTypeProvider.Factory> bindIJvmTypeProvider$Factory() {
+		return BundleSpaceTypeProviderFactory.class;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.xtext.datamartdsl.AbstractDatamartDSLRuntimeModule#bindAbstractTypeScopeProvider()
+	 */
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.xtext.AbstractTypeScopeProvider> bindAbstractTypeScopeProvider() {
+		return BundleSpaceTypeScopeProvider.class;
+	}
+
+	/**
+	 * Bind i type loader factory.
+	 *
+	 * @return the class<? extends i type loader factory>
+	 */
+	public Class<? extends ITypeLoaderFactory> bindITypeLoaderFactory() {
+		return TypeLoaderFactory.class;
+	}
+
+	/**
+	 * I type loader provider.
+	 *
+	 * @return the class<? extends i type loader provider>
+	 */
+	public Class<? extends ITypeLoaderProvider> ITypeLoaderProvider() {
+		return TypeLoaderProvider.class;
+	}
+
+
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLBundleSpaceStandaloneSetup.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLBundleSpaceStandaloneSetup.java
new file mode 100644
index 0000000..4dbd897
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLBundleSpaceStandaloneSetup.java
@@ -0,0 +1,39 @@
+package org.eclipse.osbp.xtext.statemachine;
+
+import org.eclipse.osbp.xtext.builder.xbase.setups.XbaseBundleSpaceStandaloneSetup;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+@SuppressWarnings("restriction")
+public class StatemachineDSLBundleSpaceStandaloneSetup extends
+		StatemachineDSLStandaloneSetup {
+	/**
+	 * Do setup.
+	 */
+	public static void doSetup() {
+		new StatemachineDSLBundleSpaceStandaloneSetup().createInjectorAndDoEMFRegistration();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLStandaloneSetupGenerated#createInjectorAndDoEMFRegistration()
+	 */
+	@Override
+	public Injector createInjectorAndDoEMFRegistration() {
+		XbaseBundleSpaceStandaloneSetup.doSetup();
+
+		Injector injector = createInjector();
+		register(injector);
+		return injector;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLStandaloneSetupGenerated#createInjector()
+	 */
+	@Override
+	public Injector createInjector() {
+		return Guice.createInjector(new StatemachineDSLBundleSpaceRuntimeModule());
+	}
+
+
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLRuntimeModule.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLRuntimeModule.java
new file mode 100644
index 0000000..8c729de
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLRuntimeModule.java
@@ -0,0 +1,75 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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.statemachine;
+
+import javax.inject.Singleton;
+
+import org.eclipse.osbp.dsl.xtext.lazyresolver.LazyJvmTypeLinker;
+import org.eclipse.osbp.dsl.xtext.lazyresolver.SemanticLoadingResource;
+import org.eclipse.osbp.dsl.xtext.lazyresolver.linker.LazyJvmTypeTransientValueService;
+import org.eclipse.osbp.xtext.i18n.DSLOutputConfigurationProvider;
+import org.eclipse.osbp.xtext.statemachine.jvmmodel.StatemachineDSLModelGenerator;
+import org.eclipse.osbp.xtext.statemachine.scoping.StatemachineDSLScopeProvider;
+import org.eclipse.osbp.xtext.statemachine.valueconverter.StatemachineDSLQualifiedNameProvider;
+import org.eclipse.osbp.xtext.statemachine.valueconverter.StatemachineDSLValueConverterService;
+import org.eclipse.xtext.conversion.IValueConverterService;
+import org.eclipse.xtext.generator.IGenerator;
+import org.eclipse.xtext.generator.IOutputConfigurationProvider;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.xbase.scoping.batch.XbaseBatchScopeProvider;
+
+import com.google.inject.Binder;
+
+/**
+ * Use this class to register components to be used at runtime / without the Equinox extension registry.
+ */
+public class StatemachineDSLRuntimeModule extends org.eclipse.osbp.xtext.statemachine.AbstractStatemachineDSLRuntimeModule {
+	@Override
+	public Class<? extends IGenerator> bindIGenerator() {
+		return StatemachineDSLModelGenerator.class;
+	}
+
+	public Class<? extends XbaseBatchScopeProvider> bindXbaseBatchScopeProvider() {
+		return StatemachineDSLScopeProvider.class;
+	}
+	
+	@Override
+	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return StatemachineDSLQualifiedNameProvider.class;
+	}
+
+	@Override
+	public Class<? extends IValueConverterService> bindIValueConverterService() {
+		return StatemachineDSLValueConverterService.class;
+	}
+
+	@Override
+	public void configure(Binder binder) {
+		super.configure(binder);
+		binder.bind(IOutputConfigurationProvider.class).to(DSLOutputConfigurationProvider.class).in(Singleton.class);
+	}
+
+	public Class<? extends org.eclipse.xtext.resource.XtextResource> bindXtextResource() {
+		return SemanticLoadingResource.class;
+	}
+
+	public Class<? extends org.eclipse.xtext.linking.ILinker> bindILinker() {
+		return LazyJvmTypeLinker.class;
+	}
+
+	public Class<? extends org.eclipse.xtext.serializer.sequencer.ITransientValueService> bindSerializerITransientValueService() {
+		return LazyJvmTypeTransientValueService.class;
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLStandaloneSetup.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLStandaloneSetup.java
new file mode 100644
index 0000000..f9bb603
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineDSLStandaloneSetup.java
@@ -0,0 +1,16 @@
+/*
+* generated by Xtext
+*/
+package org.eclipse.osbp.xtext.statemachine;
+
+/**
+ * Initialization support for running Xtext languages 
+ * without equinox extension registry
+ */
+public class StatemachineDSLStandaloneSetup extends StatemachineDSLStandaloneSetupGenerated{
+
+	public static void doSetup() {
+		new StatemachineDSLStandaloneSetup().createInjectorAndDoEMFRegistration();
+	}
+}
+
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineEnums.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineEnums.java
new file mode 100644
index 0000000..ceee6d3
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/StatemachineEnums.java
@@ -0,0 +1,26 @@
+package org.eclipse.osbp.xtext.statemachine;
+
+public class StatemachineEnums {
+	public enum Controls {
+		BUTTON,
+		FIELD,
+		ITEM,
+		DTO,
+		SCHEDULER,
+		LINEDISPLAY,
+		POSPRINTER,
+		CASHDRAWER,
+		PAYMENTTERMINAL
+	}
+	
+	public enum Functions {
+		GUARD,
+		OPERATION,
+		FUNCTION
+	}
+	
+	public enum StorageAccess {
+		KEY,
+		ATTRIBUTE 
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/doc-files/grammar.png b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/doc-files/grammar.png
new file mode 100644
index 0000000..bb065ab
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/doc-files/grammar.png
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/formatting/StatemachineDSLFormatter.xtend b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/formatting/StatemachineDSLFormatter.xtend
new file mode 100644
index 0000000..3579e88
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/formatting/StatemachineDSLFormatter.xtend
@@ -0,0 +1,33 @@
+/*
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.formatting
+
+import com.google.inject.Inject
+import org.eclipse.osbp.utils.xtext.GenericFormatter
+import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter
+import org.eclipse.xtext.formatting.impl.FormattingConfig
+import org.eclipse.xtext.xbase.services.XtypeGrammarAccess
+
+// import com.google.inject.Inject;
+// import org.eclipse.osbp.xtext.statemachine.services.StatemachineDSLGrammarAccess
+
+/**
+ * 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 StatemachineDSLFormatter extends AbstractDeclarativeFormatter {
+
+	@Inject XtypeGrammarAccess grammarAccess
+
+	override protected void configureFormatting(FormattingConfig c) {
+		val genericFormatter = new GenericFormatter()
+
+		genericFormatter.formatFirstLevelBlocks( c, grammar.grammar, "Statemachine", "StatemachineImport" )
+		genericFormatter.genericFormatting( c, grammar, grammarAccess )
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.xtend b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.xtend
new file mode 100644
index 0000000..21a4657
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.xtend
@@ -0,0 +1,1291 @@
+/**
+ *                                                                            
+ * Copyright (c) 2011, 2017 - 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.statemachine.jvmmodel
+
+import com.google.inject.Inject
+import java.util.Date
+import java.util.Iterator
+import java.util.Timer
+import java.util.regex.Pattern
+import org.eclipse.emf.common.util.EList
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.osbp.abstractstatemachine.AbstractDataProvider
+import org.eclipse.osbp.abstractstatemachine.AbstractEventSource
+import org.eclipse.osbp.abstractstatemachine.AbstractPeripheralService
+import org.eclipse.osbp.abstractstatemachine.AbstractStateMachine
+import org.eclipse.osbp.dsl.common.datatypes.IDto
+import org.eclipse.osbp.dsl.common.xtext.extensions.AnnotationExtension
+import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions
+import org.eclipse.osbp.dsl.semantic.common.types.LDataType
+import org.eclipse.osbp.dsl.semantic.common.types.LEnum
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedReference
+import org.eclipse.osbp.dsl.semantic.entity.LEntity
+import org.eclipse.osbp.ecview.core.^extension.model.^extension.YSuggestTextFieldEvents
+import org.eclipse.osbp.ui.api.message.MessageEvent
+import org.eclipse.osbp.ui.api.statemachine.IStateMachine
+import org.eclipse.osbp.utils.constants.GeneratorConstants
+import org.eclipse.osbp.xtext.statemachine.Statemachine
+import org.eclipse.osbp.xtext.statemachine.StatemachineAction
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButton
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlField
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler
+import org.eclipse.osbp.xtext.statemachine.StatemachineEnums
+import org.eclipse.osbp.xtext.statemachine.StatemachineFunction
+import org.eclipse.osbp.xtext.statemachine.StatemachineGuard
+import org.eclipse.osbp.xtext.statemachine.StatemachineInternalType
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperation
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter
+import org.eclipse.osbp.xtext.statemachine.StatemachinePackage
+import org.eclipse.osbp.xtext.statemachine.StatemachineState
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorage
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve
+import org.eclipse.osbp.xtext.statemachine.StatemachineTrigger
+import org.eclipse.xtext.common.types.JvmDeclaredType
+import org.eclipse.xtext.common.types.JvmField
+import org.eclipse.xtext.common.types.JvmGenericType
+import org.eclipse.xtext.common.types.JvmOperation
+import org.eclipse.xtext.common.types.JvmTypeReference
+import org.eclipse.xtext.common.types.JvmVisibility
+import org.eclipse.xtext.naming.IQualifiedNameProvider
+import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
+import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
+import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
+import org.osgi.service.component.annotations.Component
+import org.osgi.service.component.annotations.Reference
+import org.osgi.service.component.annotations.ReferenceCardinality
+import org.osgi.service.component.annotations.ReferencePolicy
+import org.slf4j.Logger
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal
+import org.eclipse.osbp.ui.api.functionlibrary.IFunctionLibraryService
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport
+import org.eclipse.osbp.runtime.common.annotations.DtoUtils
+import java.lang.reflect.Field
+
+/**
+ * <p>
+ * Statemachine
+ * This inferrer infers models of extension statemachine and generates code for a enum based statemachine 
+ * </p>
+ * 
+ * @author Joerg Riegel
+ */
+class StatemachineDSLJvmModelInferrer extends AbstractModelInferrer {
+
+	@Inject extension JvmTypesBuilder
+	@Inject extension StatemachineDSLModelGenerator
+	@Inject extension IQualifiedNameProvider
+	@Inject extension AnnotationExtension
+	@Inject extension ModelExtensions
+
+	val binderPostfix = "ServiceBinder"
+
+	def dispatch void infer(StatemachinePackage statemachinePkg, IJvmDeclaredTypeAcceptor acceptor,
+		boolean isPreIndexingPhase) {
+		statemachinePkg.generatePckgName(acceptor)
+
+		// the service binder class
+		val bindercls = statemachinePkg.toClass(statemachinePkg.name.toString.concat(binderPostfix))
+		bindercls.simpleName = bindercls.simpleName.toFirstUpper
+		acceptor.accept(bindercls,
+			[
+				annotations += _annotationTypesBuilder.annotationRef(SuppressWarnings, "serial")
+				annotations += _annotationTypesBuilder.annotationRef(typeof(Component))
+				packageName = statemachinePkg.fullyQualifiedName.toString
+				documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION
+				it.toBinderFields(statemachinePkg)
+				it.toBinderOperations(statemachinePkg)
+			])
+		for (statemachine : statemachinePkg.statemachines) {
+			val clsName = statemachine.className.toFirstUpper
+			val cls = statemachinePkg.toClass(clsName);
+			cls.superTypes.add(_typeReferenceBuilder.typeRef(AbstractStateMachine))
+			cls.simpleName = cls.simpleName.toFirstUpper
+			val pkgName = statemachinePkg.fullyQualifiedName.toString + "." + clsName.toLowerCase
+			acceptor.accept(
+				cls,
+				[
+					it.toConstructor(statemachine)
+					it.toFields(statemachine)
+					it.toOperations(statemachine)
+					packageName = pkgName
+					documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION
+				]
+			)
+			for (control : statemachine.controls) {
+				val controlClsName = control.name.toString.toFirstUpper
+				val controlCls = statemachinePkg.toClass(controlClsName);
+				controlCls.simpleName = controlCls.simpleName.toFirstUpper
+				switch control {
+					StatemachineControlScheduler: {
+						controlCls.superTypes.add(_typeReferenceBuilder.typeRef(AbstractEventSource))
+						acceptor.accept(
+							controlCls,
+							[
+								// schedulers
+								it.generateSchedulers(control)
+								packageName = pkgName
+								documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION
+							]
+						)
+					}
+					StatemachineControlButton: {
+						controlCls.superTypes.add(_typeReferenceBuilder.typeRef(AbstractEventSource))
+						acceptor.accept(
+							controlCls,
+							[
+								// buttons
+								it.generateButtons(control)
+								packageName = pkgName
+								documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION
+							]
+						)
+					}
+					StatemachineControlField: {
+						controlCls.superTypes.add(_typeReferenceBuilder.typeRef(AbstractEventSource))
+						acceptor.accept(
+							controlCls,
+							[
+								// fields
+								it.generateFields(control)
+								packageName = pkgName
+								documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION
+							]
+						)
+					}
+					StatemachineControlDTO: {
+						controlCls.superTypes.add(_typeReferenceBuilder.typeRef(AbstractDataProvider))
+						acceptor.accept(
+							controlCls,
+							[
+								// dto
+								it.generateDTOs(control)
+								packageName = pkgName
+								documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION
+							]
+						)
+					}
+					StatemachineControlPeripheral: {
+						controlCls.superTypes.add(_typeReferenceBuilder.typeRef(AbstractPeripheralService))
+						acceptor.accept(
+							controlCls,
+							[
+								packageName = pkgName
+								documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION
+							]
+						)
+					}
+				}
+			}
+		}
+	}
+	
+	def generateSchedulers(JvmGenericType controlCls, StatemachineControlScheduler control) {
+		control.schedulers.forEach [
+			var JvmField field = control.toField(it.name, _typeReferenceBuilder.typeRef(Timer))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+			field = control.toField(it.name+"Scheduler", _typeReferenceBuilder.typeRef(Long))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+		]
+		// methods
+		control.schedulers.forEach [
+			var JvmOperation operation = control.toGetter(it.name+"Scheduler",
+				_typeReferenceBuilder.typeRef(Long))
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			val scheduler = it
+			operation = control.toMethod('''set«it.name.toFirstUpper»Scheduler''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				visibility = JvmVisibility.PUBLIC
+				parameters +=
+					control.toParameter("delay", _typeReferenceBuilder.typeRef(Long));
+				body = [
+					append(
+						'''
+						if («scheduler.name» != null) {
+							«scheduler.name».cancel();
+							«scheduler.name».purge();
+						}
+						«scheduler.name» = new Timer();
+						«scheduler.name».schedule(new TaskEventSource(statemachine, new MessageEvent(EventType.TRIGGER, "«scheduler.
+							event.name»")), this.«scheduler.name»Scheduler = delay);''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+		]
+		// init
+		var JvmOperation init = control.toMethod("init",
+			_typeReferenceBuilder.typeRef(Void::TYPE)) [
+			annotations += _annotationTypesBuilder.annotationRef(Override)
+			visibility = JvmVisibility.PUBLIC
+			body = []
+		]
+		controlCls.members += init
+	}
+	
+	def generateButtons(JvmGenericType controlCls, StatemachineControlButton control) {
+		var JvmField pad = control.toField(control.name.toFirstLower + "Enabled",
+			_typeReferenceBuilder.typeRef(Boolean))
+		pad.visibility = JvmVisibility::PRIVATE
+		controlCls.members += pad
+		control.buttons.forEach [
+			var JvmField field = control.toField(it.name, _typeReferenceBuilder.typeRef(Number))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+			field = control.toField(it.name + "Caption", _typeReferenceBuilder.typeRef(String))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+			field = control.toField(it.name + "Enabled", _typeReferenceBuilder.typeRef(Boolean))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+			field = control.toField(it.name + "Image", _typeReferenceBuilder.typeRef(Object))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+		]
+		// methods
+		control.buttons.forEach [
+			var JvmOperation operation = control.toGetter(it.name,
+				_typeReferenceBuilder.typeRef(Number))
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			val button = it
+			// setter
+			operation = control.toMethod('''set«it.name.toFirstUpper»''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters +=
+					control.toParameter(button.name, _typeReferenceBuilder.typeRef(Number));
+				visibility = JvmVisibility.PUBLIC
+				body = [
+					append(
+						'''
+						«IF button.event instanceof StatemachineControlButtonAttributeEventKeyboard»
+							statemachine.processEvent(statemachine, new MessageEvent(EventType.KEYBOARD, "«(button.event as StatemachineControlButtonAttributeEventKeyboard).
+							keystroke»"));
+						«ELSEIF button.event instanceof StatemachineControlButtonAttributeEventIdentity»
+							statemachine.processEvent(statemachine, new MessageEvent(EventType.ID, "«(button.event as StatemachineControlButtonAttributeEventIdentity).identity»"));
+						«ELSEIF button.event instanceof StatemachineControlButtonAttributeEventEvent»
+							statemachine.processEvent(statemachine, new MessageEvent(EventType.TRIGGER, "«(button.event as StatemachineControlButtonAttributeEventEvent).event.name»"));
+						«ENDIF»
+						this.«button.name» = «button.name»;''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			// caption
+			operation = control.toGetter(it.name+"Caption",
+				_typeReferenceBuilder.typeRef(String))
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			operation = control.toMethod('''set«it.name.toFirstUpper»Caption''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters += control.toParameter(button.name + "Caption",
+					_typeReferenceBuilder.typeRef(String));
+				visibility = JvmVisibility.PUBLIC
+				body = [
+					append(
+						'''
+						pcs.firePropertyChange("«button.name»Caption", this.«button.name»Caption, this.«button.name»Caption = «button.
+							name»Caption);''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			// enabled
+			operation = control.toGetter(it.name+"Enabled",
+				_typeReferenceBuilder.typeRef(Boolean))
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			operation = control.toMethod('''set«it.name.toFirstUpper»Enabled''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters += control.toParameter(button.name + "Enabled",
+					_typeReferenceBuilder.typeRef(Boolean));
+				visibility = JvmVisibility.PUBLIC
+				body = [
+					append(
+						'''
+						pcs.firePropertyChange("«button.name»Enabled", this.«button.name»Enabled, this.«button.name»Enabled = «button.
+							name»Enabled);''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			// image
+			operation = control.toGetter(it.name+"Image",
+				_typeReferenceBuilder.typeRef(Object))
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			operation = control.toMethod('''set«it.name.toFirstUpper»Image''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters += control.toParameter(button.name + "Image",
+					_typeReferenceBuilder.typeRef(Object));
+				visibility = JvmVisibility.PUBLIC
+				body = [
+					append(
+						'''
+						pcs.firePropertyChange("«button.name»Image", this.«button.name»Image, this.«button.name»Image = «button.
+							name»Image);''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+		]
+		// keypad enabled
+		var JvmOperation getEnabled = control.toGetter(control.name.toFirstLower + "Enabled",
+			_typeReferenceBuilder.typeRef(Boolean))
+		getEnabled.visibility = JvmVisibility::PUBLIC
+		controlCls.members += getEnabled
+		var JvmOperation setEnabled = control.toMethod(
+			'''set«control.name.toFirstUpper»Enabled''',
+			_typeReferenceBuilder.typeRef(Void::TYPE)) [
+			parameters += control.toParameter(control.name.toFirstLower + "Enabled",
+				_typeReferenceBuilder.typeRef(Boolean));
+			visibility = JvmVisibility.PUBLIC
+			body = [
+				append(
+					'''
+					«FOR button:control.buttons»
+					set«button.name.toFirstUpper»Enabled(«control.name.toFirstLower»Enabled);
+					«ENDFOR»
+					pcs.firePropertyChange("«control.name.toFirstLower»Enabled", this.«control.name.toFirstLower»Enabled, this.«control.name.toFirstLower»Enabled = «control.name.toFirstLower»Enabled);
+					'''
+				)
+			]
+		]
+		setEnabled.visibility = JvmVisibility::PUBLIC
+		controlCls.members += setEnabled
+		// init
+		var _hasImages = false
+		for (button : control.buttons) {
+			if(button.hasImage) _hasImages = true
+		}
+		val hasImages = _hasImages
+		var JvmOperation init = control.toMethod("init",
+			_typeReferenceBuilder.typeRef(Void::TYPE)) [
+			annotations += _annotationTypesBuilder.annotationRef(Override)
+			visibility = JvmVisibility.PUBLIC
+			// suppress label if image is set and load resource
+			body = [
+				append(
+					'''
+						super.init();
+						set«control.name.toFirstUpper»Enabled(false);
+						«IF hasImages»
+							«FOR button : control.buttons»
+								«IF button.hasImage»set«button.name.toFirstUpper»Caption(null);
+								«ENDIF»
+							«ENDFOR»
+							if(statemachine != null) {
+							«FOR button : control.buttons»
+								«IF button.hasImage && button.image.length>0»	set«button.name.toFirstUpper»Image(statemachine.getThemeResourceService().getThemeResource("«button.
+							image»", ThemeResourceType.ICON));
+								«ENDIF»
+							«ENDFOR»
+							}
+						«ENDIF»
+					''')
+			]
+		]
+		controlCls.members += init
+	}
+	
+	def generateFields(JvmGenericType controlCls, StatemachineControlField control) {
+		control.fields.forEach [
+			var JvmField field = control.toField(it.name,
+				_typeReferenceBuilder.typeRef(it.decodeType))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+			// extra suggest text event field
+			if (it.attributeType.attributeType == StatemachineInternalType.SUGGESTTEXT) {
+				field = control.toField(it.name + "Event",
+					_typeReferenceBuilder.typeRef(YSuggestTextFieldEvents))
+				field.visibility = JvmVisibility::PRIVATE
+				controlCls.members += field
+			}
+			field = control.toField(it.name + "Enabled", _typeReferenceBuilder.typeRef(Boolean))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+		]
+		control.layouts.forEach [
+			var JvmField layout = control.toField(it.name + "Enabled", _typeReferenceBuilder.typeRef(Boolean))
+			layout.visibility = JvmVisibility::PRIVATE
+			controlCls.members += layout
+		]
+		// methods
+		control.fields.forEach [
+			var JvmOperation operation = control.toGetter(it.name,
+				_typeReferenceBuilder.typeRef(it.decodeType))
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			val field = it
+			// setter
+			operation = control.toMethod('''set«it.name.toFirstUpper»''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters += control.toParameter(field.name,
+					_typeReferenceBuilder.typeRef(field.decodeType))
+				visibility = JvmVisibility.PUBLIC
+				body = [
+					append(
+						'''
+						«field.decodeSetter»''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			// enabled
+			operation = control.toGetter(it.name+"Enabled",
+				_typeReferenceBuilder.typeRef(Boolean))
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			operation = control.toMethod('''set«it.name.toFirstUpper»Enabled''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters += control.toParameter(field.name + "Enabled",
+					_typeReferenceBuilder.typeRef(Boolean));
+				visibility = JvmVisibility.PUBLIC
+				body = [
+					append(
+						'''
+						pcs.firePropertyChange("«field.name»Enabled", this.«field.name»Enabled, this.«field.name»Enabled = «field.
+							name»Enabled);''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			// extra methods for suggestText field 
+			if (it.attributeType.attributeType == StatemachineInternalType.SUGGESTTEXT) {
+				operation = control.toGetter(it.name + "Event",
+					_typeReferenceBuilder.typeRef(YSuggestTextFieldEvents))
+				operation.visibility = JvmVisibility::PUBLIC
+				controlCls.members += operation
+				val eventfield = it
+		
+				// setter
+				operation = control.toMethod('''set«it.name.toFirstUpper»Event''',
+					_typeReferenceBuilder.typeRef(Void::TYPE)) [
+					parameters += control.toParameter(eventfield.name+"Event",
+						_typeReferenceBuilder.typeRef(YSuggestTextFieldEvents))
+					visibility = JvmVisibility.PUBLIC
+					body = [
+						append(
+							'''
+							pcs.firePropertyChange("«field.name»Event", this.«field.name»Event, this.«field.name»Event = «field.name»Event);''')]
+				]
+				operation.visibility = JvmVisibility::PUBLIC
+				controlCls.members += operation
+			}
+		]
+		control.layouts.forEach [
+			// enabled
+			var JvmOperation operation = control.toGetter(it.name+"Enabled",
+				_typeReferenceBuilder.typeRef(Boolean))
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			val layout = it
+			operation = control.toMethod('''set«it.name.toFirstUpper»Enabled''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters += control.toParameter(layout.name + "Enabled",
+					_typeReferenceBuilder.typeRef(Boolean));
+				visibility = JvmVisibility.PUBLIC
+				body = [
+					append(
+						'''
+						pcs.firePropertyChange("«layout.name»Enabled", this.«layout.name»Enabled, this.«layout.name»Enabled = «layout.
+							name»Enabled);''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+		]
+		// init
+		var JvmOperation init = control.toMethod("init",
+			_typeReferenceBuilder.typeRef(Void::TYPE)) [
+			annotations += _annotationTypesBuilder.annotationRef(Override)
+			visibility = JvmVisibility.PUBLIC
+			body = [
+				append(
+					'''
+						super.init();
+						«FOR field : control.fields»
+							pcs.firePropertyChange("«field.name»Enabled", this.«field.name»Enabled, this.«field.name»Enabled = false);
+						«ENDFOR»
+						«FOR layout : control.layouts»
+							pcs.firePropertyChange("«layout.name»Enabled", this.«layout.name»Enabled, this.«layout.name»Enabled = false);
+						«ENDFOR»
+					''')
+			]
+		]
+		controlCls.members += init
+	}
+	
+	def generateDTOs(JvmGenericType controlCls, StatemachineControlDTO control) {
+		control.dtos.forEach [
+			var JvmField field = control.toField(it.name,
+				_typeReferenceBuilder.typeRef(it.attributeType.attributeType.fullyQualifiedName.toString))
+			field.visibility = JvmVisibility::PRIVATE
+			controlCls.members += field
+		]
+		// methods
+		control.dtos.forEach [
+			val dto = it
+			// dto getter
+			var JvmOperation operation = control.toMethod('''get«it.attributeType.attributeType.name.toFirstUpper»''',
+				_typeReferenceBuilder.typeRef(IDto)) [
+					visibility = JvmVisibility::PUBLIC
+					body = [append(
+					'''
+					return «dto.name»;''')]
+				]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			// dto id getter
+			if(it.attributeType.attributeType.primaryKeyAttribute != null) {
+				operation = control.toMethod('''get«it.attributeType.attributeType.name.toFirstUpper»«it.attributeType.attributeType.idAttributeName.toFirstUpper»''',
+					_typeReferenceBuilder.typeRef(it.attributeType.attributeType.idAttributeType.name)) [
+						visibility = JvmVisibility::PUBLIC
+						body = [append(
+						'''
+						return «dto.name».get«dto.attributeType.attributeType.idAttributeName.toFirstUpper»();''')]
+					]
+				operation.visibility = JvmVisibility::PUBLIC
+				controlCls.members += operation
+			}
+			// attribute/ref getter/setter
+			for(f:it.attributeType.attributeType.features) {
+				if(f instanceof LDtoInheritedAttribute) {
+					var typeName = f.inheritedFeature.type.name
+					switch f.inheritedFeature.type {
+						LDataType: {
+							if((f.inheritedFeature.type as LDataType).jvmTypeReference != null) {
+								typeName = (f.inheritedFeature.type as LDataType).jvmTypeReference.simpleName
+							}
+						}
+						LEnum: {
+							// due to a bug the fqn of the feature returns the entity fqn and not dto fqn - so build it myself
+							typeName = f.eContainer.fullyQualifiedName.toString.replace(f.eContainer.fullyQualifiedName.lastSegment.toString, (f.inheritedFeature.type as LEnum).name)
+						}
+					}
+					var isTimestamp = false
+					// don't want the sql datatypes at ui level
+					if(typeName.equals("Timestamp")) {
+						isTimestamp = true
+						typeName = "org.joda.time.DateTime"
+					}
+					val _typeName = typeName
+					val _isTimestamp = isTimestamp
+					operation = control.toMethod('''get«it.attributeType.attributeType.name.toFirstUpper»«f.inheritedFeature.name.toFirstUpper»''',
+						_typeReferenceBuilder.typeRef(typeName)) [
+							visibility = JvmVisibility::PUBLIC
+							body = [append(
+							'''
+							if(«dto.name»!=null) {
+								return «IF _isTimestamp»new DateTime(«ENDIF»«dto.name».get«f.inheritedFeature.name.toFirstUpper»()«IF _isTimestamp»)«ENDIF»;
+							} else {
+								return null;
+							}''')]
+						]
+					controlCls.members += operation
+					operation = control.toMethod('''set«it.attributeType.attributeType.name.toFirstUpper»«f.inheritedFeature.name.toFirstUpper»''',
+						_typeReferenceBuilder.typeRef(Void::TYPE)) [
+							visibility = JvmVisibility::PUBLIC
+							parameters += control.toParameter(f.inheritedFeature.name,	_typeReferenceBuilder.typeRef(_typeName))
+							body = [append('''«dto.name».set«f.inheritedFeature.name.toFirstUpper»(«f.inheritedFeature.name»«IF _isTimestamp».toDate()«ENDIF»);''')]
+						]
+					controlCls.members += operation
+				}
+				if(f instanceof LDtoInheritedReference) {
+					if(f.inheritedFeature.toMany) {
+						if(control.dtos.containsType((f.inheritedFeature.type as LEntity).getName())) {
+							val typeName = f.inheritedFeature.type.name+"Dto"
+							controlCls.members += operation
+							operation = control.toMethod('''addTo«it.attributeType.attributeType.name.toFirstUpper»«f.inheritedFeature.name.toFirstUpper»''',
+								_typeReferenceBuilder.typeRef(Void::TYPE)) [
+									visibility = JvmVisibility::PUBLIC
+									parameters += control.toParameter(f.inheritedFeature.name,	_typeReferenceBuilder.typeRef(IDto))
+									body = [append('''«dto.name».addTo«f.inheritedFeature.name.toFirstUpper»((«f.inheritedFeature.type.name.toString»Dto)«f.inheritedFeature.name»);''')]
+								]
+							controlCls.members += operation
+							operation = control.toMethod('''removeFrom«it.attributeType.attributeType.name.toFirstUpper»«f.inheritedFeature.name.toFirstUpper»''',
+								_typeReferenceBuilder.typeRef(Void::TYPE)) [
+									visibility = JvmVisibility::PUBLIC
+									parameters += control.toParameter(f.inheritedFeature.name,	_typeReferenceBuilder.typeRef(IDto))
+									body = [append('''«dto.name».removeFrom«f.inheritedFeature.name.toFirstUpper»((«f.inheritedFeature.type.name.toString»Dto)«f.inheritedFeature.name»);''')]
+								]
+							controlCls.members += operation
+						}
+					} else {
+						if(control.dtos.containsType((f.inheritedFeature.type as LEntity).getName())) {
+							val typeName = f.inheritedFeature.type.name+"Dto"
+							controlCls.members += operation
+							operation = control.toMethod('''set«it.attributeType.attributeType.name.toFirstUpper»«f.inheritedFeature.name.toFirstUpper»''',
+								_typeReferenceBuilder.typeRef(Void::TYPE)) [
+									visibility = JvmVisibility::PUBLIC
+									parameters += control.toParameter(f.inheritedFeature.name,	_typeReferenceBuilder.typeRef(IDto))
+									body = [append('''«dto.name».set«f.inheritedFeature.name.toFirstUpper»((«f.inheritedFeature.type.name.toString»Dto)«f.inheritedFeature.name»);''')]
+								]
+							controlCls.members += operation
+						}
+					}
+				}
+			}
+			// dto setter
+			operation = control.toMethod('''set«it.attributeType.attributeType.name.toFirstUpper»''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters += control.toParameter(dto.name,
+					_typeReferenceBuilder.typeRef(IDto))
+				visibility = JvmVisibility.PUBLIC
+				body = [
+					append(
+						'''
+						pcs.firePropertyChange("«dto.attributeType.attributeType.name.toFirstLower»", this.«dto.name», this.«dto.name» = («dto.attributeType.attributeType.name»)«dto.name»);«IF dto.hasEvent»
+						statemachine.processEvent(statemachine, new MessageEvent(MessageEvent.EventType.TRIGGER, "«dto.event.name»"));«ENDIF»''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			controlCls.members += operation
+			operation = control.toMethod('''update«it.attributeType.attributeType.name.toFirstUpper»''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+					visibility = JvmVisibility::PUBLIC
+					parameters += control.toParameter(dto.name,
+						_typeReferenceBuilder.typeRef(IDto))
+					body = [append('''((IDTOService<«dto.attributeType.attributeType.name»>)dtoServices.get("«dto.attributeType.attributeType.name»")).update((«dto.attributeType.attributeType.name»)«dto.name»);''')]
+				]
+			controlCls.members += operation
+			operation = control.toMethod('''delete«it.attributeType.attributeType.name.toFirstUpper»''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+					visibility = JvmVisibility::PUBLIC
+					parameters += control.toParameter(dto.name,
+						_typeReferenceBuilder.typeRef(IDto))
+					body = [append('''((IDTOService<«dto.attributeType.attributeType.name»>)dtoServices.get("«dto.attributeType.attributeType.name»")).delete((«dto.attributeType.attributeType.name»)«dto.name»);''')]
+				]
+			controlCls.members += operation
+		]
+		// init
+		var JvmOperation init = control.toMethod("init",
+			_typeReferenceBuilder.typeRef(Void::TYPE)) [
+			annotations += _annotationTypesBuilder.annotationRef(Override)
+			visibility = JvmVisibility.PUBLIC
+			body = [
+				append(
+					'''
+						if (dtoServices.isEmpty()) {
+							«FOR dto : control.dtos»
+								initDatasource("«dto.name»");
+							«ENDFOR»
+						}
+					''')
+				]
+			]
+		controlCls.members += init
+	}
+	
+	def boolean containsType(EList<StatemachineControlDTOAttribute> list, String entityName) {
+		for(attr:list) {
+			if(entityName.equals(attr.attributeType.attributeType.wrappedType?.name)) {
+				return true
+			}
+		}
+		return false
+	}
+
+	def decodeSetter(StatemachineControlFieldAttribute field) {
+		switch field.attributeType.attributeType {
+			case BOOLEAN: {
+				return '''pcs.firePropertyChange("«field.name»", this.«field.name», this.«field.name» = «field.name»);
+					'''
+			}
+			case INTEGER: {
+				return '''pcs.firePropertyChange("«field.name»", this.«field.name», this.«field.name» = «field.name»);
+					'''
+			}
+			case LONG: {
+				return '''pcs.firePropertyChange("«field.name»", this.«field.name», this.«field.name» = «field.name»);
+					'''
+			}
+			case DOUBLE: {
+				return '''pcs.firePropertyChange("«field.name»", this.«field.name», this.«field.name» = «field.name»);
+					'''
+			}
+			case STRING: {
+				return '''pcs.firePropertyChange("«field.name»", this.«field.name», this.«field.name» = «field.name»);
+					'''
+			}
+			case DATE: {
+				return '''pcs.firePropertyChange("«field.name»", this.«field.name», this.«field.name» = «field.name»);
+					'''
+			}
+			case SUGGESTTEXT: {
+				return '''
+				pcs.firePropertyChange("«field.name»", this.«field.name», this.«field.name» = «field.name»);
+				set«field.name.toFirstUpper»Event(null);
+				if(«field.name» == null || «field.name».isEmpty()) {
+					set«field.name.toFirstUpper»Event(YSuggestTextFieldEvents.CLEAR);
+				} else {
+					set«field.name.toFirstUpper»Event(YSuggestTextFieldEvents.OPEN_POPUP);
+				}'''
+			}
+		}
+	}
+
+	def decodeType(StatemachineControlFieldAttribute field) {
+		switch field.attributeType.attributeType {
+			case BOOLEAN: {
+				return Boolean;
+			}
+			case INTEGER: {
+				return Integer;
+			}
+			case LONG: {
+				return Long;
+			}
+			case DOUBLE: {
+				return Double;
+			}
+			case STRING: {
+				return String;
+			}
+			case DATE: {
+				return Date;
+			}
+			case SUGGESTTEXT: {
+				return String;
+			}
+		}
+	}
+
+	def void toConstructor(JvmDeclaredType type, Statemachine statemachine) {
+		type.members += statemachine.toConstructor(
+			[
+				body = [
+					append(
+						'''
+						super();
+						state = States.«statemachine.initialState.name»;'''
+					)
+				]
+			])
+	}
+
+	def void toFields(JvmGenericType type, Statemachine statemachine) {
+		var JvmField field = null
+
+		// create logger
+		field = statemachine.toField("log", _typeReferenceBuilder.typeRef(Logger))[
+			setInitializer([append('''org.slf4j.LoggerFactory.getLogger("statemachine")''')])]
+		field.static = true
+		field.visibility = JvmVisibility::PRIVATE
+		type.members += field
+		field = statemachine.toField("state", _typeReferenceBuilder.typeRef("States"))
+		field.visibility = JvmVisibility::PRIVATE
+		type.members += field
+	}
+
+	def void toOperations(JvmGenericType type, Statemachine statemachine) {
+		type.members += statemachine.toMethod("start", _typeReferenceBuilder.typeRef(Void::TYPE),
+			[
+				annotations += _annotationTypesBuilder.annotationRef(Override)
+				body = [
+					append(
+						'''schedule(this, 100, new MessageEvent(EventType.TRIGGER, "«statemachine.initialEvent.name»"));''')
+				]
+			])
+		type.members += statemachine.toInterface("State")[
+			members += statemachine.toMethod("process", _typeReferenceBuilder.typeRef("States"),
+				[
+					parameters += statemachine.toParameter("stateMachine", _typeReferenceBuilder.typeRef(IStateMachine))
+					parameters += statemachine.toParameter("event", _typeReferenceBuilder.typeRef(MessageEvent))
+				])]
+		type.members += statemachine.toMethod("processEvent", _typeReferenceBuilder.typeRef(Void::TYPE),
+			[
+				annotations += _annotationTypesBuilder.annotationRef(Override)
+				parameters += statemachine.toParameter("stateMachine", _typeReferenceBuilder.typeRef(IStateMachine))
+				parameters += statemachine.toParameter("event", _typeReferenceBuilder.typeRef(MessageEvent))
+				body = [append('''state = state.process(stateMachine, event);''')]
+			])
+		type.members += statemachine.toEnumerationType("States") [
+			superTypes += _typeReferenceBuilder.typeRef("State")
+			statemachine.states.forEach [ state |
+				documentation = state.documentation
+				members += state.toEnumerationLiteral(state.name,
+					[
+						initializer = [
+							append(
+								'''
+								@Override
+								public States process(final IStateMachine stateMachine, final MessageEvent event) {
+									stateMachine.dispatchMessages(event);
+									switch (event.getType()) {
+								«IF state.keystroke != null»		case KEYBOARD:
+											stateMachine.append("«state.keystroke.name»", event.getId());«IF state.hasKeyOperation»
+											«state.keyOperation.decodeOperation(0)»
+								«ENDIF»
+											break;
+								«ENDIF»
+								«IF state.identity != null»		case ID:
+											«state.identity.decodeOperation(true, 0)»
+											break;
+								«ENDIF»
+								«IF state.triggers.size > 0»		case TRIGGER:
+											«state.createTriggerEvents»
+								«ENDIF»
+										default:
+											break;
+									}
+									return this;
+								}''')
+						]
+					])
+			]
+		]
+	}
+
+	def String className(Statemachine statemachine) {
+		var String clsName = statemachine.name.toString.toFirstUpper
+		var parts = clsName.split(Pattern.quote("."))
+		var len = parts.length
+		if (len > 1) {
+			return parts.get(len - 1).toFirstUpper
+		}
+		return clsName
+	}
+
+	def createTriggerEvents(StatemachineState state) 
+		'''
+		switch (event.getId()) {
+		«FOR trig   : state.triggers»«FOR t:trig.triggers»	case "«t.name»":
+		«ENDFOR»
+		«trig.doGuards(2)»
+		«ENDFOR»
+		«identation(1)»}
+		«identation(1)»break;
+		'''
+	
+	def doGuards(StatemachineTrigger trigger, int level) {
+		return 
+		'''
+		«trigger.recurseGuards(trigger.guards.iterator, level)»«IF trigger.guards.size == 0 && !trigger.hasTransition || trigger.guards.size > 0»
+		«identation(level)»break;«ENDIF»'''
+	}
+	
+	def String recurseGuards(StatemachineTrigger trigger, Iterator<StatemachineGuard> guards, int level) {
+		var body = ""
+		if(guards.hasNext) {
+			var guard = guards.next
+			body = 
+			'''
+			«guard.decodeGuard(level)»
+			«trigger.recurseGuards(guards, level+1)»
+			«identation(level)»}
+			«guard.decodeGuardOnFail(level)»
+			'''
+		} else {
+			body = '''
+			«trigger.generateActions(level)»
+			«IF trigger.hasTransition»«identation(level)»return «trigger.transition.getName()»;
+			«ENDIF»'''
+		}
+		return body
+	}
+	
+	def identation(int level) {
+		var body = ''''''
+		for(var i=0; i<level;i++) {
+			body = '''«body»	'''
+		}
+		return body
+	}
+	
+	def decodeGuard(StatemachineGuard guard, int level) 
+		'''«identation(level)»if((boolean)«call(guard as EObject, guard.guard.name, StatemachineEnums.Functions.GUARD, null, null, false)») {'''
+	
+	def decodeGuardOnFail(StatemachineGuard guard, int level)
+		'''
+		«IF guard.hasOnFail»
+		«identation(level)»else {
+			«identation(level)»Notification.show(stateMachine.getTranslation("«guard.onFailCaption»"), stateMachine.getTranslation("«guard.onFailDescription»"), Type.«guard.onFailType.getName()»);
+		«identation(level)»}«ENDIF»'''
+
+	def generateActions(StatemachineTrigger trigger, int level)
+		'''
+		«FOR action : trigger.actions»«action.switchAction(level)»
+		«ENDFOR»
+		'''
+	
+	def switchAction(StatemachineAction action, int level) {
+		switch action {
+			StatemachineActionPeripheralBlinkRate: {
+				return '''«identation(level)»stateMachine.set("blinkRate", «action.blinkRate»);
+					'''
+			}
+			StatemachineActionPeripheralClear: {
+				return '''«identation(level)»stateMachine.set("clearDisplay", "");
+					'''
+			}
+			StatemachineActionPeripheralCreateWindow: {
+				return '''«identation(level)»stateMachine.set("createWindow", "«action.viewportRow»|«action.viewportColumn»|«action.viewportHeight»|«action.viewportWidth»|«action.windowHeight»|«action.windowWidth»");'''
+			}
+			StatemachineActionPeripheralCursorType: {
+				return '''«identation(level)»stateMachine.set("cursorType", LineDisplayConst.«action.cursorType.getName()»);'''
+			}
+			StatemachineActionPeripheralDestroyWindow: {
+				return '''«identation(level)»stateMachine.set("destroyWindow", "");'''
+			}
+			StatemachineActionPeripheralDeviceBrightness: {
+				return '''«identation(level)»stateMachine.set("deviceBrightness", «action.brightness»);'''
+			}
+			StatemachineActionPeripheralDisplayBitmap: {
+				return '''«identation(level)»stateMachine.set("displayBitmap", «action.bitmapId»);'''
+			}
+			StatemachineActionPeripheralDisplayText: {
+				if (action.hasType) {
+					return '''«identation(level)»stateMachine.set("displayLine", «action.text.concatenation(_typeReferenceBuilder.typeRef(String))»+"|"+LineDisplayConst.«action.textType.getName()»);'''
+				} else {
+					return '''«identation(level)»stateMachine.set("displayLine", «action.text.concatenation(_typeReferenceBuilder.typeRef(String))»);'''
+				}
+			}
+			StatemachineActionPeripheralDisplayTextAt: {
+				if (action.hasType) {
+					return '''«identation(level)»stateMachine.set("displayTextAt", "«action.row»|«action.column»|"+«action.text.concatenation(_typeReferenceBuilder.typeRef(String))»+"|"+LineDisplayConst.«action.textType.getName()»);'''
+				} else {
+					return '''«identation(level)»stateMachine.set("displayTextAt", "«action.row»|«action.column»|"+«action.text.concatenation(_typeReferenceBuilder.typeRef(String))»);'''
+				}
+			}
+			StatemachineActionPeripheralInterCharacterWait: {
+				return '''«identation(level)»stateMachine.set("interCharacterWait", «action.getWait()»);'''
+			}
+			StatemachineActionPeripheralMarqueeFormat: {
+				return '''«identation(level)»stateMachine.set("marqueeFormat", LineDisplayConst.«action.format.getName()»);'''
+			}
+			StatemachineActionPeripheralMarqueeRepeatWait: {
+				return '''«identation(level)»stateMachine.set("marqueeRepeatWait", «action.getWait()»);'''
+			}
+			StatemachineActionPeripheralMarqueeType: {
+				return '''«identation(level)»stateMachine.set("marqueeType", LineDisplayConst.«action.marqueeType.getName()»);'''
+			}
+			StatemachineActionPeripheralMarqueeUnitWait: {
+				return '''«identation(level)»stateMachine.set("marqueeUnitWait", «action.getWait()»);'''
+			}
+			StatemachineActionPeripheralScroll: {
+				return '''«identation(level)»stateMachine.set("scroll", ""+LineDisplayConst.«action.direction.getName()»+"|«action.units»");'''
+			}
+			StatemachineActionPeripheralOpenDrawer: {
+				return '''«identation(level)»stateMachine.set("openDrawer", 0);'''
+			}
+			StatemachineActionPeripheralPrintBarcode: {
+				return '''«identation(level)»stateMachine.set("printBarcode", "«action.data»|"+POSPrinterConst.«action.barcodeType.
+					getName()»);'''
+			}
+			StatemachineActionPeripheralPrintBitmap: {
+				return '''«identation(level)»stateMachine.set("printBitmap", «action.bitmapId»);'''
+			}
+			StatemachineActionPeripheralPrintCut: {
+				return '''«identation(level)»stateMachine.set("printCut",«action.text.concatenation(_typeReferenceBuilder.typeRef(String))»);'''
+			}
+			StatemachineActionPeripheralPrintNormal: {
+				return '''«identation(level)»stateMachine.set("printNormal", «action.text.concatenation(_typeReferenceBuilder.typeRef(String))»);'''
+			}
+			StatemachineActionPeripheralPrintRegisterBitmap: {
+				return '''«identation(level)»stateMachine.set("registerBitmap", "«action.bitmapId»|icons/«action.name».bmp");'''
+			}
+			StatemachineActionPeripheralPTOpen: {
+				return '''«identation(level)»stateMachine.set("paymentTerminalOpen", «action.host.concatenation(_typeReferenceBuilder.typeRef(String))»+"|"+«action.port.concatenation(_typeReferenceBuilder.typeRef(int))»);'''
+			}
+			StatemachineActionPeripheralPTClose: {
+				return '''«identation(level)»stateMachine.set("paymentTerminalClose", "");'''
+			}
+			StatemachineActionPeripheralPTAcknowledge: {
+				return '''«identation(level)»stateMachine.set("paymentTerminalAcknowledge", "");'''
+			}
+//			StatemachineActionPeripheralPTPrepaidTopUp: {
+//				return '''«identation(level)»stateMachine.set("paymentTerminalPrepaidTopUp", «action.source.concatenation(_typeReferenceBuilder.typeRef(Double))»);'''
+//			}
+			StatemachineActionPeripheralPTReversal: {
+				return '''«identation(level)»stateMachine.set("paymentTerminalReversal", «action.password.concatenation(_typeReferenceBuilder.typeRef(String))»+"|"+«action.receipt.concatenation(_typeReferenceBuilder.typeRef(String))»);'''
+			}
+			StatemachineActionPeripheralPTRegistration: {
+				return '''«identation(level)»stateMachine.set("paymentTerminalRegistration", «action.password.concatenation(_typeReferenceBuilder.typeRef(String))»+"|«action.configuration»");'''
+			}
+			StatemachineActionPeripheralPTAuthorization: {
+				return '''«identation(level)»stateMachine.set("paymentTerminalAuthorization", «action.amount.concatenation(_typeReferenceBuilder.typeRef(Double))»);'''
+			}
+			StatemachineActionPeripheralPrintReport: {
+				return '''«identation(level)»stateMachine.set("printReport", "«action.report.fullyQualifiedName»«IF action.hasFilter»|«action.key»«ENDIF»");'''
+			}
+			StatemachineActionFieldSet: {
+				return '''«identation(level)»stateMachine.set("«action.attribute.name»", «action.source.concatenation(_typeReferenceBuilder.typeRef(action.attribute.attributeType.attributeType.literal))»);'''
+			}
+			StatemachineActionFieldRemove: {
+				return '''«identation(level)»stateMachine.remove("«action.attribute.name»", -1);'''
+			}
+			StatemachineActionFieldClear: {
+				return '''«identation(level)»stateMachine.clear("«action.attribute.name»");'''
+			}
+			StatemachineActionFieldKeystroke: {
+				return '''«identation(level)»stateMachine.append("«action.attribute.name»", event.getId());'''
+			}
+			StatemachineActionItemVisible: {
+				return '''«identation(level)»stateMachine.enable("«action.attribute.name»", true);'''
+			}
+			StatemachineActionItemInvisible: {
+				return '''«identation(level)»stateMachine.enable("«action.attribute.name»", false);'''
+			}
+			StatemachineActionButtonCaption: {
+				return '''«identation(level)»stateMachine.caption("«action.attribute.name»", "«action.caption»");'''
+			}
+			StatemachineActionButtonImage: {
+				return '''«identation(level)»stateMachine.image("«action.attribute.name»", "«action.image»");'''
+			}
+			StatemachineActionDTOFind: {
+				return '''«identation(level)»stateMachine.find("«action.dto.attributeType.attributeType.name»", "«action.attribute.inheritedFeature.name»", «action.search.concatenation»);'''
+			}
+			StatemachineStorage: {
+				return '''«identation(level)»stateMachine.putStorage("«action.key»","«action.attribute»", «action.content.concatenation»);'''
+			}
+			StatemachineActionScheduler: {
+				return '''«identation(level)»stateMachine.set("«action.scheduler.name»Scheduler", «action.scheduler.delay»L);'''
+			}
+			StatemachineOperation: {
+				return '''«action.decodeOperation(level)»'''
+			}
+			StatemachineActionConditionalTransition: {
+				return 
+				'''
+				«action.guard.decodeGuard(level)»
+				«FOR act:action.actions»
+				«act.switchAction(level+1)»
+				«ENDFOR»
+				«identation(level+1)»return «action.transition.name»;
+				«identation(level)»}'''
+			}
+		}
+	}
+
+	def concatenation(StatemachineActionFieldConcatenation concatenation) {
+		return concatenation(concatenation, null)
+	}
+	
+	def concatenation(StatemachineActionFieldConcatenation concatenation, JvmTypeReference cast) 
+	'''«concatenation.first.concatenationDecode(cast)»«FOR element : concatenation.more»+«element.
+		concatenationDecode(cast)»«ENDFOR»'''
+
+	def concatenationDecode(StatemachineActionFieldSource action, JvmTypeReference cast) {
+		switch action {
+			StatemachineActionFieldSourceString: {
+				return '''"«action.text»"'''
+			}
+			StatemachineActionFieldSourceNumber: {
+				return '''«action.value»'''
+			}
+			StatemachineActionFieldSourceEvaluate: {
+				return '''stateMachine.«action.evaluationtype.literal»()'''
+			}
+			StatemachineActionFieldSourceEvent: {
+				return '''event.getId()'''
+			}
+			StatemachineActionFieldSourceTranslate: {
+				return '''stateMachine.getTranslation("«action.text»")'''
+			}
+			StatemachineActionFieldGet: {
+				return '''«IF cast != null && 
+				!cast.simpleName.equals(action.attribute.attributeType.attributeType.literal) && 
+				(action.attribute.attributeType.attributeType.literal.equals("String") ||
+				action.attribute.attributeType.attributeType.literal.equals("SuggestText"))»«cast.simpleName».parse«cast.simpleName»((String)«ENDIF»stateMachine.get("«action.attribute.name»")«IF cast != null && cast.simpleName.equals("String") && !action.attribute.attributeType.attributeType.literal.equals("String")».toString()«ENDIF»«IF cast != null && 
+				!cast.simpleName.equals(action.attribute.attributeType.attributeType.literal) &&
+				(action.attribute.attributeType.attributeType.literal.equals("String") ||
+				action.attribute.attributeType.attributeType.literal.equals("SuggestText"))»)«ENDIF»'''
+			}
+			StatemachineOperation: {
+				return action.decodeOperation(0)
+			}
+			StatemachineFunction: {
+				return action.decodeFunction(0)
+			}
+			StatemachineStorageRetrieve: {
+				return '''«IF cast != null»(«cast.qualifiedName»)«ENDIF»stateMachine.getStorage("«action.key»", "«action.attribute»")'''
+			}
+			StatemachineActionFieldSourceDtoAttribute: {
+				return '''stateMachine.get("«action.dto.attributeType.attributeType.name»«action.attribute.inheritedFeature.name.toFirstUpper»")«IF cast != null && cast.simpleName.equals("String")».toString()«ENDIF»'''
+			}
+			StatemachineActionPeripheralPTResponse: {
+				return '''stateMachine.get("PaymentTerminalResponse")'''
+			}
+//			StatemachineActionPeripheralPTBalanceRequest: {
+//				return '''stateMachine.get("paymentDeviceBalanceRequest")'''
+//			}
+		}
+	}
+	
+	def decodeOperation(StatemachineOperation operation, int level) {
+		return decodeOperation(operation, false, level)
+	}
+	
+	def String decodeOperation(StatemachineOperation operation, boolean isIdentity, int level)
+		'''
+		«identation(level)»if(!((boolean)«call(operation as EObject, operation.operation.name, StatemachineEnums.Functions.OPERATION, operation.first, operation.more, isIdentity)»)) {
+		«identation(level)»	Notification.show("Operation failed", "«operation.operation.name»", Type.ERROR_MESSAGE);
+		«identation(level)»	return this;	
+		«identation(level)»}'''
+
+	def String decodeFunction(StatemachineFunction function, int level)
+		'''
+		«identation(level)»«call(function as EObject, function.function.name, StatemachineEnums.Functions.FUNCTION, function.first, function.more, false)»'''
+
+	def call(EObject parent, String name, StatemachineEnums.Functions function, StatemachineOperationParameter first, StatemachineOperationParameter[] more, boolean isIdentity) {
+		// find some parents
+		var Statemachine statemachine = null
+		var eObj = parent
+		while (!(eObj instanceof StatemachinePackage)) {
+			if (eObj instanceof Statemachine) {
+				statemachine = eObj as Statemachine
+			}
+			eObj = eObj.eContainer
+		}
+		if (eObj instanceof StatemachinePackage) {
+			switch function {
+				case GUARD:
+					return '''«eObj.name + "." + eObj.fullyQualifiedName.lastSegment.toFirstUpper»«binderPostfix».getFunctionLibraryService().guard(stateMachine, "«statemachine.functionGroup.fullyQualifiedName»", "«name»")'''
+				case OPERATION:
+					return '''«eObj.name + "." + eObj.fullyQualifiedName.lastSegment.toFirstUpper»«binderPostfix».getFunctionLibraryService().operation(stateMachine, "«statemachine.functionGroup.fullyQualifiedName»", «name.processParameters(first, more, isIdentity)»)'''
+				case FUNCTION:
+					return '''«eObj.name + "." + eObj.fullyQualifiedName.lastSegment.toFirstUpper»«binderPostfix».getFunctionLibraryService().function(stateMachine, "«statemachine.functionGroup.fullyQualifiedName»", «name.processParameters(first, more, isIdentity)»)'''
+			}
+		} else {
+			return '''/* error: parents not found */'''
+		}
+	}
+
+	def processParameters(String name, StatemachineOperationParameter first, StatemachineOperationParameter[] more, boolean isIdentity) {
+		if(first == null) {
+			return '''"«name»"«IF isIdentity», event.getId()«ENDIF»'''
+		}
+		var body = '''"«name»", «IF isIdentity»event.getId(), «ENDIF»«first.source.concatenation»'''
+		if(more != null) {
+			for(para:more) {
+				body = '''«body», «para.source.concatenation»'''	
+			}
+		}
+		return body
+	}
+
+	def void toBinderFields(JvmDeclaredType type, StatemachinePackage datamart) {
+		var JvmField field = null
+
+		// create logger
+		field = datamart.toField("log", _typeReferenceBuilder.typeRef(Logger))[
+			setInitializer([append('''org.slf4j.LoggerFactory.getLogger("servicebinder")''')])]
+		field.static = true
+		field.visibility = JvmVisibility::PRIVATE
+		type.members += field
+		field = datamart.toField("functionLibraryService", _typeReferenceBuilder.typeRef(IFunctionLibraryService))
+		field.static = true
+		field.visibility = JvmVisibility::PRIVATE
+		type.members += field
+	}
+
+	def void toBinderOperations(JvmDeclaredType type, StatemachinePackage datamart) {
+		var JvmOperation operation
+
+		type.members += datamart.toMethod("getFunctionLibraryService",
+			_typeReferenceBuilder.typeRef(IFunctionLibraryService),
+			[
+				visibility = JvmVisibility.PUBLIC
+				static = true
+				body = [append('''return functionLibraryService;''')]
+			])
+
+		// bind services
+		type.members += datamart.toMethod("bindFunctionLibraryService", _typeReferenceBuilder.typeRef(Void::TYPE),
+			[
+				var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference))
+				annotationRef.addAnnAttr(datamart, "cardinality", ReferenceCardinality.MANDATORY)
+				annotationRef.addAnnAttr(datamart, "policy", ReferencePolicy.STATIC)
+				annotations += annotationRef
+				visibility = JvmVisibility.PUBLIC
+				synchronized = true
+				parameters +=
+					datamart.toParameter("functionLibraryService",
+						_typeReferenceBuilder.typeRef(IFunctionLibraryService))
+				body = [
+					append(
+						'''
+						this.functionLibraryService = functionLibraryService;
+						log.debug("Statemachine FunctionLibraryServiceService bound");''')]
+			])
+
+		// unbind services
+		type.members += datamart.toMethod("unbindFunctionLibraryService", _typeReferenceBuilder.typeRef(Void::TYPE),
+			[
+				visibility = JvmVisibility.PUBLIC
+				synchronized = true
+				parameters +=
+					datamart.toParameter("functionLibraryService",
+						_typeReferenceBuilder.typeRef(IFunctionLibraryService))
+				body = [
+					append(
+						'''
+						this.functionLibraryService = null;
+						log.debug("Statemachine FunctionLibraryServiceService unbound");''')]
+			])
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLModelGenerator.xtend b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLModelGenerator.xtend
new file mode 100644
index 0000000..877bd07
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLModelGenerator.xtend
@@ -0,0 +1,106 @@
+package org.eclipse.osbp.xtext.statemachine.jvmmodel
+
+import java.util.Locale
+import java.util.ResourceBundle
+import javax.inject.Inject
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.osbp.runtime.common.i18n.ITranslator
+import org.eclipse.osbp.abstractstatemachine.AbstractStateMachine
+import org.eclipse.osbp.ui.api.message.MessageEvent
+import org.eclipse.osbp.ui.api.statemachine.IStateMachine
+import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils
+import org.eclipse.osbp.xtext.i18n.I18NModelGenerator
+import org.eclipse.osbp.xtext.statemachine.StatemachinePackage
+import org.eclipse.xtext.common.types.JvmEnumerationLiteral
+import org.eclipse.xtext.generator.IFileSystemAccess
+import org.eclipse.xtext.xbase.compiler.GeneratorConfig
+import org.eclipse.xtext.xbase.compiler.ImportManager
+import org.eclipse.xtext.xbase.compiler.XbaseCompiler
+import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable
+import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
+import org.eclipse.xtext.xbase.jvmmodel.JvmModelAssociator
+import org.osgi.service.useradmin.User
+import jpos.LineDisplayConst
+import jpos.POSPrinterConst
+import org.eclipse.osbp.abstractstatemachine.TaskEventSource
+import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType
+import org.eclipse.osbp.ecview.core.^extension.model.^extension.YSuggestTextFieldEvents
+import org.joda.time.DateTime
+import com.vaadin.ui.Notification
+import java.util.List
+import org.eclipse.osbp.dsl.dto.lib.services.IDTOService
+
+class StatemachineDSLModelGenerator extends I18NModelGenerator {
+	@Inject extension BasicDslGeneratorUtils
+	@Inject extension JvmModelAssociator
+	@Inject XbaseCompiler compiler
+	
+	var public static String pckgName = null
+	
+	def void generatePckgName(StatemachinePackage pckg, IJvmDeclaredTypeAcceptor acceptor) {
+		pckgName = pckg.getName
+	}
+
+	override doGenerate(Resource input, IFileSystemAccess fsa) {
+//		addTranslatables("Groups,Users")
+		super.doGenerate(input, fsa)
+	}
+	
+	override createAppendable(EObject context, ImportManager importManager, GeneratorConfig config) {
+		// required to initialize the needed builder to avoid deprecated methods
+		builder = context.eResource
+		// ---------
+		addImportFor(importManager, _typeReferenceBuilder
+			,User
+			,ResourceBundle
+			,Locale
+			,List
+			,ITranslator
+			,AbstractStateMachine
+			,IStateMachine
+			,MessageEvent
+			,MessageEvent.EventType
+			,TaskEventSource
+			,LineDisplayConst
+			,POSPrinterConst
+			,ThemeResourceType
+			,YSuggestTextFieldEvents
+			,DateTime
+			,Notification
+			,Notification.Type
+			,IDTOService
+		)
+		super.createAppendable(context, importManager, config)
+	}
+		
+	def void generateInitialization(JvmEnumerationLiteral it, ITreeAppendable appendable, GeneratorConfig config) {
+		if (compilationStrategy != null) {
+			appendable.append(" { ")
+			appendable.increaseIndentation
+			appendable.newLine
+			compilationStrategy.apply(appendable)
+			appendable.decreaseIndentation
+			appendable.newLine
+			appendable.append("}")
+		} else {
+			val expression = associatedExpression
+			if (expression != null && config.generateExpressions) {
+				if(expression.hasErrors()) {
+					appendable.append(" /* Skipped initializer because of errors */")
+				} else {
+					appendable.append(" = ")
+					compiler.compileAsJavaExpression(expression, appendable, type)
+				}
+			}
+		}
+	}
+
+	override generateEnumLiteral(JvmEnumerationLiteral it, ITreeAppendable appendable, GeneratorConfig config) {
+		appendable.newLine
+		generateJavaDoc(appendable, config)
+		annotations.generateAnnotations(appendable, true, config)
+		appendable.append(simpleName)
+		generateInitialization(appendable, config)
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/package-info.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/package-info.java
new file mode 100644
index 0000000..ecbed1d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/package-info.java
@@ -0,0 +1,25 @@
+/*
+ *                                                                            
+ *  Copyright (c) 2011, 2017 - 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                                 
+ *                                                                            
+ *  Initial contribution:                                                      
+ *     Loetz GmbH & Co. KG                               
+ * 
+ */
+
+/**
+ * 
+ *  Implements the OSBP Xtext state machine DSL. Constructs state machines
+ *  
+ *   
+ *  @since  0.9.0
+ *  
+ *  <p>The Statemachine Grammar Xtext Syntax Graph<br>
+ *  <img src="doc-files/grammar.png" alt="The Statemachine Grammar Xtext Syntax Graph">
+ */
+package org.eclipse.osbp.xtext.statemachine;
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/scoping/StatemachineDSLScopeProvider.xtend b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/scoping/StatemachineDSLScopeProvider.xtend
new file mode 100644
index 0000000..4665fe6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/scoping/StatemachineDSLScopeProvider.xtend
@@ -0,0 +1,401 @@
+/*
+ *                                                                            
+ *  Copyright (c) 2013, 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.statemachine.scoping
+
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EReference
+import org.eclipse.emf.ecore.InternalEObject
+import org.eclipse.osbp.dsl.semantic.dto.LDto
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute
+import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryFunction
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryGuard
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryOperation
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryParameter
+import org.eclipse.osbp.xtext.statemachine.Statemachine
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButton
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlField
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage
+import org.eclipse.osbp.xtext.statemachine.StatemachineEnums
+import org.eclipse.osbp.xtext.statemachine.StatemachineInternalType
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorage
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve
+import org.eclipse.xtext.resource.EObjectDescription
+import org.eclipse.xtext.resource.IEObjectDescription
+import org.eclipse.xtext.scoping.IScope
+import org.eclipse.xtext.scoping.impl.MapBasedScope
+import org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsBatchScopeProvider
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport
+import org.eclipse.xtext.xbase.XBlockExpression
+import org.eclipse.xtext.xbase.XMemberFeatureCall
+import java.util.List
+import org.eclipse.xtext.xbase.XStringLiteral
+import org.eclipse.xtext.xbase.XFeatureCall
+import org.eclipse.xtext.xbase.XIfExpression
+import org.eclipse.xtext.xbase.XExpression
+import java.util.ArrayList
+import org.eclipse.osbp.xtext.statemachine.StatemachineEnums.StorageAccess
+
+class StatemachineDSLScopeProvider extends XbaseWithAnnotationsBatchScopeProvider {
+	override getScope(EObject context, EReference reference) {
+		switch reference {
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD:
+				return getFunctionService(context, StatemachineEnums.Functions.GUARD)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_OPERATION__OPERATION:
+				return getFunctionService(context, StatemachineEnums.Functions.OPERATION)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_GUARD__GUARD:
+				return getFunctionService(context, StatemachineEnums.Functions.GUARD)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_FUNCTION__FUNCTION:
+				return getFunctionService(context, StatemachineEnums.Functions.FUNCTION)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_STATE__IDENTITY:
+				return getFunctionService(context, StatemachineEnums.Functions.OPERATION)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_STATE__KEYSTROKE:
+				return getStringFields(context)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_STATE__KEY_OPERATION:
+				return getFunctionService(context, StatemachineEnums.Functions.OPERATION)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.LINEDISPLAY)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.CASHDRAWER)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.POSPRINTER)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.POSPRINTER)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.POSPRINTER)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.POSPRINTER)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.POSPRINTER)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+//			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_BALANCE_REQUEST__DEVICE:
+//				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+//			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_PREPAID_TOP_UP__DEVICE:
+//				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE:
+				return getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.BUTTON)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.BUTTON)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.FIELD)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.FIELD)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.FIELD)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.FIELD)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.FIELD)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.ITEM)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE:
+				return getActions(context, StatemachineEnums.Controls.ITEM)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__DTO:
+				return getActions(context, StatemachineEnums.Controls.DTO)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE:
+				return getFindDTOAttributes(context)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO:
+				return getDTO(context)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE:
+				return getDTOAttributes(context)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER:
+				return getActions(context, StatemachineEnums.Controls.SCHEDULER)
+			case StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY:
+				return getStorageKey(context, StatemachineEnums.StorageAccess.KEY)
+//			case StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__KEY:
+//				return getStorageKey(context, StatemachineEnums.StorageAccess.KEY)
+//			case StatemachineDSLPackage.Literals.STATEMACHINE_STORAGE_RETRIEVE__ATTRIBUTE:
+//				return getStorageKey(context, StatemachineEnums.StorageAccess.ATTRIBUTE)
+			default:
+				super.getScope(context, reference)
+		}
+	}
+	
+//	def void iterateBlockExpression(XExpression expression, ArrayList<IEObjectDescription> result, StorageAccess access) {
+//		if(expression instanceof XIfExpression) {
+//		}
+//		if(expression instanceof XMemberFeatureCall) {
+//			if(expression.memberCallTarget instanceof XFeatureCall) {
+//				var callTarget = expression.memberCallTarget as XFeatureCall 
+//				if(callTarget.feature.identifier.contains("IStateMachine.putStorage")) {
+//					val params = <String>newArrayList
+//					expression.memberCallArguments.forEach[
+//						if(it instanceof XStringLiteral) {
+//							params.add(it.value)
+//						}
+//					]
+//					switch (access) {
+//						case KEY:
+//							result.add(EObjectDescription.create(params.get(0), expression))
+//						case ATTRIBUTE:
+//							result.add(EObjectDescription.create(params.get(1), expression))
+//					}
+//				}
+//			}
+//		}
+//	}
+	
+	def IScope getStorageKey(EObject context, StatemachineEnums.StorageAccess access) {
+		val result = <IEObjectDescription>newArrayList
+		var statemachine = context
+		while (statemachine != null && !(statemachine instanceof Statemachine)) {
+			statemachine = statemachine.eContainer
+		}
+		if (statemachine != null && statemachine instanceof Statemachine) {
+			(statemachine as Statemachine).states.forEach[
+				it.triggers.forEach[
+					it.actions.forEach [
+						if(it instanceof StatemachineStorage) {
+							switch (access) {
+								case KEY:
+									result.add(EObjectDescription.create(it.key, it))
+								case ATTRIBUTE:
+									result.add(EObjectDescription.create(it.attribute, it))
+							}
+						}
+					]
+				]
+			]
+//			(statemachine as Statemachine).functionGroup.operations.forEach[
+//				var opName = it.name
+//				if("computeButtons".equals(opName)) {
+//					if(it.body instanceof XBlockExpression) {
+//						(it.body as XBlockExpression).expressions.forEach[
+//							it.iterateBlockExpression(result, access)
+//						]
+//					}
+//				}
+//			]
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+	
+	def IScope getStringFields(EObject context) {
+		var result = <IEObjectDescription>newArrayList
+		var statemachine = context as EObject
+		while (statemachine != null && !(statemachine instanceof Statemachine)) {
+			statemachine = statemachine.eContainer
+		}
+		if (statemachine != null && (statemachine instanceof Statemachine) && ((statemachine as Statemachine).controls != null)) {
+			for (control : (statemachine as Statemachine).controls) {
+				if (control instanceof StatemachineControlField) {
+					for (field : (control as StatemachineControlField).fields) {
+						if(field.attributeType.attributeType == StatemachineInternalType.STRING ||
+							field.attributeType.attributeType == StatemachineInternalType.SUGGESTTEXT) {
+							result.add(EObjectDescription.create(field.name, field))
+						}
+					}
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+	def IScope getDTOAttributes(EObject context) {
+		var dtoFind = context as StatemachineActionFieldSourceDtoAttribute
+		var dto = dtoFind.dto.attributeType.attributeType as LDto
+		return dto.scopeDTOAttributes(context)
+	}
+
+	def IScope getDTO(EObject context) {
+		var result = <IEObjectDescription>newArrayList
+		var statemachine = context as EObject
+		while (statemachine != null && !(statemachine instanceof Statemachine)) {
+			statemachine = statemachine.eContainer
+		}
+		if (statemachine != null && (statemachine instanceof Statemachine) && ((statemachine as Statemachine).controls != null)) {
+			for (control : (statemachine as Statemachine).controls) {
+				if(control instanceof StatemachineControlDTO) {
+					for(dto:control.dtos) {
+						result.add(EObjectDescription.create(dto.name, dto))
+					}
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+	
+	def IScope getFindDTOAttributes(EObject context) {
+		var dtoFind = context as StatemachineActionDTOFind
+		var dto = dtoFind.dto.attributeType.attributeType as LDto
+		return dto.scopeDTOAttributes(context)
+	}
+	
+	def IScope scopeDTOAttributes(LDto dto, EObject context) {
+		var result = <IEObjectDescription>newArrayList
+		if (dto != null) {
+			for (f : dto.allFeatures) {
+				if (f instanceof LDtoInheritedAttribute) {
+					var LEntityAttribute attr = null
+					if (f.inheritedFeature.eIsProxy()) {
+
+						// This provokes no problems of loops or cycling linking.
+						val uri = (f.inheritedFeature as InternalEObject).eProxyURI
+						attr = context.eResource.resourceSet.getEObject(uri, true) as LEntityAttribute
+					} else {
+						attr = f.inheritedFeature as LEntityAttribute
+					}
+					result.add(EObjectDescription.create(attr.name, f as LDtoInheritedAttribute))
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+	def IScope getActions(EObject context, StatemachineEnums.Controls controlType) {
+		var result = <IEObjectDescription>newArrayList
+		var statemachine = context as EObject
+		while (statemachine != null && !(statemachine instanceof Statemachine)) {
+			statemachine = statemachine.eContainer
+		}
+		if (statemachine != null && (statemachine instanceof Statemachine) && ((statemachine as Statemachine).controls != null)) {
+			for (control : (statemachine as Statemachine).controls) {
+				if (controlType == StatemachineEnums.Controls.BUTTON && control instanceof StatemachineControlButton) {
+					for (button : (control as StatemachineControlButton).buttons) {
+						result.add(EObjectDescription.create(button.name, button))
+					}
+				}
+				if (controlType == StatemachineEnums.Controls.SCHEDULER && control instanceof StatemachineControlScheduler) {
+					for (scheduler : (control as StatemachineControlScheduler).schedulers) {
+						result.add(EObjectDescription.create(scheduler.name, scheduler))
+					}
+				}
+				if (controlType == StatemachineEnums.Controls.FIELD && control instanceof StatemachineControlField) {
+					for (field : (control as StatemachineControlField).fields) {
+						result.add(EObjectDescription.create(field.name, field))
+					}
+				}
+				if (controlType == StatemachineEnums.Controls.ITEM && (control instanceof StatemachineControlButton || control instanceof StatemachineControlField)) {
+					if(control instanceof StatemachineControlButton) {
+						for (button : (control as StatemachineControlButton).buttons) {
+							result.add(EObjectDescription.create(button.name, button))
+						}
+						result.add(EObjectDescription.create(control.name, control))
+					}
+					if(control instanceof StatemachineControlField) {
+						for (field : (control as StatemachineControlField).fields) {
+							result.add(EObjectDescription.create(field.name, field))
+						}
+						for (layout : (control as StatemachineControlField).layouts) {
+							result.add(EObjectDescription.create(layout.name, layout))
+						}
+					}
+				}
+				if (controlType == StatemachineEnums.Controls.DTO && control instanceof StatemachineControlDTO) {
+					for (dto : (control as StatemachineControlDTO).dtos) {
+						result.add(EObjectDescription.create(dto.name, dto))
+					}
+				}
+				if (controlType == StatemachineEnums.Controls.LINEDISPLAY && control instanceof StatemachineControlPeripheral) {
+					for (element : (control as StatemachineControlPeripheral).lineDisplays) {
+						result.add(EObjectDescription.create(element.name, element))
+					}
+				}
+				if (controlType == StatemachineEnums.Controls.POSPRINTER && control instanceof StatemachineControlPeripheral) {
+					for (element : (control as StatemachineControlPeripheral).posPrinters) {
+						result.add(EObjectDescription.create(element.name, element))
+					}
+				}
+				if (controlType == StatemachineEnums.Controls.CASHDRAWER && control instanceof StatemachineControlPeripheral) {
+					for (element : (control as StatemachineControlPeripheral).cashDrawers) {
+						result.add(EObjectDescription.create(element.name, element))
+					}
+				}
+				if (controlType == StatemachineEnums.Controls.PAYMENTTERMINAL && control instanceof StatemachineControlPeripheral) {
+					for (element : (control as StatemachineControlPeripheral).paymentTerminals) {
+						result.add(EObjectDescription.create(element.name, element))
+					}
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+	def IScope 	getFunctionService(EObject context, StatemachineEnums.Functions function) {
+		var result = <IEObjectDescription>newArrayList
+		var statemachine = context as EObject
+		while (statemachine != null && !(statemachine instanceof Statemachine)) {
+			statemachine = statemachine.eContainer
+		}
+		if (statemachine != null && (statemachine instanceof Statemachine) && ((statemachine as Statemachine).functionGroup != null)) {
+			switch function {
+				case GUARD:
+					for (FunctionLibraryGuard element : (statemachine as Statemachine).functionGroup.guards) {
+						result.add(EObjectDescription.create(element.name, (element as FunctionLibraryGuard)))
+					}
+				case OPERATION:	
+					for (FunctionLibraryOperation element : (statemachine as Statemachine).functionGroup.operations) {
+						result.add(EObjectDescription.create(element.name, (element as FunctionLibraryOperation)))
+					}
+				case FUNCTION:
+					for (FunctionLibraryFunction element : (statemachine as Statemachine).functionGroup.functions) {
+						if(element.params.size > 0) {
+							var first = element.params.get(0) as FunctionLibraryParameter
+							if("IStateMachine".equals(first.parameterType.simpleName)) {
+								result.add(EObjectDescription.create(element.name, (element as FunctionLibraryFunction)))
+							}
+						}
+					}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/validation/StatemachineDSLValidator.xtend b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/validation/StatemachineDSLValidator.xtend
new file mode 100644
index 0000000..b56f30b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/validation/StatemachineDSLValidator.xtend
@@ -0,0 +1,24 @@
+/*
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.validation
+//import org.eclipse.xtext.validation.Check
+
+/**
+ * Custom validation rules. 
+ *
+ * see http://www.eclipse.org/Xtext/documentation.html#validation
+ */
+class StatemachineDSLValidator extends AbstractStatemachineDSLValidator {
+
+//  public static val INVALID_NAME = 'invalidName'
+//
+//	@Check
+//	def checkGreetingStartsWithCapital(Greeting greeting) {
+//		if (!Character.isUpperCase(greeting.name.charAt(0))) {
+//			warning('Name should start with a capital', 
+//					MyDslPackage.Literals.GREETING__NAME,
+//					INVALID_NAME)
+//		}
+//	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/valueconverter/StatemachineDSLQualifiedNameProvider.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/valueconverter/StatemachineDSLQualifiedNameProvider.java
new file mode 100644
index 0000000..9f1df73
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/valueconverter/StatemachineDSLQualifiedNameProvider.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.statemachine.valueconverter;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperation;
+import org.eclipse.xtext.naming.IQualifiedNameConverter;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider;
+
+import com.google.inject.Inject;
+
+@SuppressWarnings("restriction")
+public class StatemachineDSLQualifiedNameProvider extends XbaseQualifiedNameProvider {
+
+	@Inject
+	private IQualifiedNameConverter qualifiedNameConverter;
+
+	@Override
+	public QualifiedName getFullyQualifiedName(EObject obj) {
+		if (obj == null) {
+			return QualifiedName.create("");
+		}
+		return super.getFullyQualifiedName(obj);
+	}
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/valueconverter/StatemachineDSLValueConverterService.java b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/valueconverter/StatemachineDSLValueConverterService.java
new file mode 100644
index 0000000..74e1ec6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/valueconverter/StatemachineDSLValueConverterService.java
@@ -0,0 +1,41 @@
+/**
+ * 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 - Initial implementation
+ */
+package org.eclipse.osbp.xtext.statemachine.valueconverter;
+
+import org.eclipse.osbp.xtext.basic.valueconverter.TRANSLATABLESTRINGValueConverter;
+import org.eclipse.xtext.conversion.IValueConverter;
+import org.eclipse.xtext.conversion.ValueConverter;
+import org.eclipse.xtext.xbase.conversion.XbaseValueConverterService;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+/**
+ * Adds a value conversion for the QualifiedNameWithWildCard rule.
+ * 
+ */
+@SuppressWarnings("restriction")
+@Singleton
+public class StatemachineDSLValueConverterService extends XbaseValueConverterService {
+	@Inject
+	private TRANSLATABLESTRINGValueConverter converter;
+
+	@ValueConverter(rule = "QualifiedNameWithWildCard")
+	public IValueConverter<String> getQualifiedNameWithWildCard() {
+		return getQualifiedNameValueConverter();
+	}
+
+	@ValueConverter(rule = "TRANSLATABLESTRING")
+	public IValueConverter<String> getTranslatableStringValueConverter() {
+		return converter;
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/formatting/.StatemachineDSLFormatter.java._trace b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/formatting/.StatemachineDSLFormatter.java._trace
new file mode 100644
index 0000000..109b56b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/formatting/.StatemachineDSLFormatter.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/formatting/StatemachineDSLFormatter.java b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/formatting/StatemachineDSLFormatter.java
new file mode 100644
index 0000000..999434e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/formatting/StatemachineDSLFormatter.java
@@ -0,0 +1,32 @@
+/**
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.formatting;
+
+import com.google.inject.Inject;
+import org.eclipse.osbp.utils.xtext.GenericFormatter;
+import org.eclipse.xtext.Grammar;
+import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter;
+import org.eclipse.xtext.formatting.impl.FormattingConfig;
+import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;
+
+/**
+ * This class contains custom formatting description.
+ * 
+ * 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
+ */
+@SuppressWarnings("all")
+public class StatemachineDSLFormatter extends AbstractDeclarativeFormatter {
+  @Inject
+  private XtypeGrammarAccess grammarAccess;
+  
+  protected void configureFormatting(final FormattingConfig c) {
+    final GenericFormatter genericFormatter = new GenericFormatter();
+    Grammar _grammar = this.grammar.getGrammar();
+    genericFormatter.formatFirstLevelBlocks(c, _grammar, "Statemachine", "StatemachineImport");
+    genericFormatter.genericFormatting(c, this.grammar, this.grammarAccess);
+  }
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/.StatemachineDSLJvmModelInferrer.java._trace b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/.StatemachineDSLJvmModelInferrer.java._trace
new file mode 100644
index 0000000..73ac2ef
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/.StatemachineDSLJvmModelInferrer.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/.StatemachineDSLModelGenerator.java._trace b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/.StatemachineDSLModelGenerator.java._trace
new file mode 100644
index 0000000..f716084
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/.StatemachineDSLModelGenerator.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.java b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.java
new file mode 100644
index 0000000..7e4a45d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.java
@@ -0,0 +1,3801 @@
+/**
+ * Copyright (c) 2011, 2017 - 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.statemachine.jvmmodel;
+
+import com.google.common.base.Objects;
+import com.google.inject.Inject;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Timer;
+import java.util.function.Consumer;
+import java.util.regex.Pattern;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.abstractstatemachine.AbstractDataProvider;
+import org.eclipse.osbp.abstractstatemachine.AbstractEventSource;
+import org.eclipse.osbp.abstractstatemachine.AbstractPeripheralService;
+import org.eclipse.osbp.abstractstatemachine.AbstractStateMachine;
+import org.eclipse.osbp.dsl.common.datatypes.IDto;
+import org.eclipse.osbp.dsl.common.xtext.extensions.AnnotationExtension;
+import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions;
+import org.eclipse.osbp.dsl.semantic.common.types.LAttribute;
+import org.eclipse.osbp.dsl.semantic.common.types.LDataType;
+import org.eclipse.osbp.dsl.semantic.common.types.LEnum;
+import org.eclipse.osbp.dsl.semantic.common.types.LReference;
+import org.eclipse.osbp.dsl.semantic.common.types.LScalarType;
+import org.eclipse.osbp.dsl.semantic.common.types.LType;
+import org.eclipse.osbp.dsl.semantic.dto.LDto;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoAbstractAttribute;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoFeature;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedReference;
+import org.eclipse.osbp.dsl.semantic.entity.LEntity;
+import org.eclipse.osbp.ecview.core.extension.model.extension.YSuggestTextFieldEvents;
+import org.eclipse.osbp.ui.api.functionlibrary.IFunctionLibraryService;
+import org.eclipse.osbp.ui.api.message.MessageEvent;
+import org.eclipse.osbp.ui.api.statemachine.IStateMachine;
+import org.eclipse.osbp.utils.constants.GeneratorConstants;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryFunction;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryGuard;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryOperation;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryStatemachineGroup;
+import org.eclipse.osbp.xtext.reportdsl.Report;
+import org.eclipse.osbp.xtext.statemachine.Statemachine;
+import org.eclipse.osbp.xtext.statemachine.StatemachineAction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonCaption;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionButtonImage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionConditionalTransition;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldClear;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldConcatenation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldGet;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldKeystroke;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldRemove;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSet;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSource;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvaluate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceNumber;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceString;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceTranslate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemInvisible;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionItemVisible;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralBlinkRate;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralClear;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCreateWindow;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralCursorType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDestroyWindow;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDeviceBrightness;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayText;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralDisplayTextAt;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralInterCharacterWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeFormat;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeRepeatWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralMarqueeUnitWait;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralOpenDrawer;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAcknowledge;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTAuthorization;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTClose;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTOpen;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTRegistration;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTResponse;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPTReversal;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBarcode;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintCut;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintNormal;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintRegisterBitmap;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralPrintReport;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionPeripheralScroll;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControl;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButton;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventIdentity;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttributeEventKeyboard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlField;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlVisibility;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDTOType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEnums;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvaluationType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEvent;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFieldType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFunction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineGuard;
+import org.eclipse.osbp.xtext.statemachine.StatemachineInternalType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayCursorType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeFormat;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayMarqueeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayScrollTextType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineLineDisplayTextType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperation;
+import org.eclipse.osbp.xtext.statemachine.StatemachineOperationParameter;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePOSPrinterBarcodeType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineState;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorageRetrieve;
+import org.eclipse.osbp.xtext.statemachine.StatemachineTrigger;
+import org.eclipse.osbp.xtext.statemachine.StatemachineUserMessageType;
+import org.eclipse.osbp.xtext.statemachine.jvmmodel.StatemachineDSLModelGenerator;
+import org.eclipse.xtend2.lib.StringConcatenation;
+import org.eclipse.xtext.common.types.JvmAnnotationReference;
+import org.eclipse.xtext.common.types.JvmConstructor;
+import org.eclipse.xtext.common.types.JvmDeclaredType;
+import org.eclipse.xtext.common.types.JvmEnumerationLiteral;
+import org.eclipse.xtext.common.types.JvmEnumerationType;
+import org.eclipse.xtext.common.types.JvmField;
+import org.eclipse.xtext.common.types.JvmFormalParameter;
+import org.eclipse.xtext.common.types.JvmGenericType;
+import org.eclipse.xtext.common.types.JvmMember;
+import org.eclipse.xtext.common.types.JvmOperation;
+import org.eclipse.xtext.common.types.JvmTypeReference;
+import org.eclipse.xtext.common.types.JvmVisibility;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
+import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer;
+import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
+import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder;
+import org.eclipse.xtext.xbase.lib.Conversions;
+import org.eclipse.xtext.xbase.lib.Extension;
+import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
+import org.eclipse.xtext.xbase.lib.StringExtensions;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.slf4j.Logger;
+
+/**
+ * <p>
+ * Statemachine
+ * This inferrer infers models of extension statemachine and generates code for a enum based statemachine
+ * </p>
+ * 
+ * @author Joerg Riegel
+ */
+@SuppressWarnings("all")
+public class StatemachineDSLJvmModelInferrer extends AbstractModelInferrer {
+  @Inject
+  @Extension
+  private JvmTypesBuilder _jvmTypesBuilder;
+  
+  @Inject
+  @Extension
+  private StatemachineDSLModelGenerator _statemachineDSLModelGenerator;
+  
+  @Inject
+  @Extension
+  private IQualifiedNameProvider _iQualifiedNameProvider;
+  
+  @Inject
+  @Extension
+  private AnnotationExtension _annotationExtension;
+  
+  @Inject
+  @Extension
+  private ModelExtensions _modelExtensions;
+  
+  private final String binderPostfix = "ServiceBinder";
+  
+  protected void _infer(final StatemachinePackage statemachinePkg, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
+    this._statemachineDSLModelGenerator.generatePckgName(statemachinePkg, acceptor);
+    String _name = statemachinePkg.getName();
+    String _string = _name.toString();
+    String _concat = _string.concat(this.binderPostfix);
+    final JvmGenericType bindercls = this._jvmTypesBuilder.toClass(statemachinePkg, _concat);
+    String _simpleName = bindercls.getSimpleName();
+    String _firstUpper = StringExtensions.toFirstUpper(_simpleName);
+    bindercls.setSimpleName(_firstUpper);
+    final Procedure1<JvmGenericType> _function = new Procedure1<JvmGenericType>() {
+      public void apply(final JvmGenericType it) {
+        EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+        JvmAnnotationReference _annotationRef = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(SuppressWarnings.class, "serial");
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
+        EList<JvmAnnotationReference> _annotations_1 = it.getAnnotations();
+        JvmAnnotationReference _annotationRef_1 = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(Component.class);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations_1, _annotationRef_1);
+        QualifiedName _fullyQualifiedName = StatemachineDSLJvmModelInferrer.this._iQualifiedNameProvider.getFullyQualifiedName(statemachinePkg);
+        String _string = _fullyQualifiedName.toString();
+        it.setPackageName(_string);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION);
+        StatemachineDSLJvmModelInferrer.this.toBinderFields(it, statemachinePkg);
+        StatemachineDSLJvmModelInferrer.this.toBinderOperations(it, statemachinePkg);
+      }
+    };
+    acceptor.<JvmGenericType>accept(bindercls, _function);
+    EList<Statemachine> _statemachines = statemachinePkg.getStatemachines();
+    for (final Statemachine statemachine : _statemachines) {
+      {
+        String _className = this.className(statemachine);
+        final String clsName = StringExtensions.toFirstUpper(_className);
+        final JvmGenericType cls = this._jvmTypesBuilder.toClass(statemachinePkg, clsName);
+        EList<JvmTypeReference> _superTypes = cls.getSuperTypes();
+        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(AbstractStateMachine.class);
+        _superTypes.add(_typeRef);
+        String _simpleName_1 = cls.getSimpleName();
+        String _firstUpper_1 = StringExtensions.toFirstUpper(_simpleName_1);
+        cls.setSimpleName(_firstUpper_1);
+        QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(statemachinePkg);
+        String _string_1 = _fullyQualifiedName.toString();
+        String _plus = (_string_1 + ".");
+        String _lowerCase = clsName.toLowerCase();
+        final String pkgName = (_plus + _lowerCase);
+        final Procedure1<JvmGenericType> _function_1 = new Procedure1<JvmGenericType>() {
+          public void apply(final JvmGenericType it) {
+            StatemachineDSLJvmModelInferrer.this.toConstructor(it, statemachine);
+            StatemachineDSLJvmModelInferrer.this.toFields(it, statemachine);
+            StatemachineDSLJvmModelInferrer.this.toOperations(it, statemachine);
+            it.setPackageName(pkgName);
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION);
+          }
+        };
+        acceptor.<JvmGenericType>accept(cls, _function_1);
+        EList<StatemachineControl> _controls = statemachine.getControls();
+        for (final StatemachineControl control : _controls) {
+          {
+            String _name_1 = control.getName();
+            String _string_2 = _name_1.toString();
+            final String controlClsName = StringExtensions.toFirstUpper(_string_2);
+            final JvmGenericType controlCls = this._jvmTypesBuilder.toClass(statemachinePkg, controlClsName);
+            String _simpleName_2 = controlCls.getSimpleName();
+            String _firstUpper_2 = StringExtensions.toFirstUpper(_simpleName_2);
+            controlCls.setSimpleName(_firstUpper_2);
+            boolean _matched = false;
+            if (!_matched) {
+              if (control instanceof StatemachineControlScheduler) {
+                _matched=true;
+                EList<JvmTypeReference> _superTypes_1 = controlCls.getSuperTypes();
+                JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(AbstractEventSource.class);
+                _superTypes_1.add(_typeRef_1);
+                final Procedure1<JvmGenericType> _function_2 = new Procedure1<JvmGenericType>() {
+                  public void apply(final JvmGenericType it) {
+                    StatemachineDSLJvmModelInferrer.this.generateSchedulers(it, ((StatemachineControlScheduler)control));
+                    it.setPackageName(pkgName);
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION);
+                  }
+                };
+                acceptor.<JvmGenericType>accept(controlCls, _function_2);
+              }
+            }
+            if (!_matched) {
+              if (control instanceof StatemachineControlButton) {
+                _matched=true;
+                EList<JvmTypeReference> _superTypes_1 = controlCls.getSuperTypes();
+                JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(AbstractEventSource.class);
+                _superTypes_1.add(_typeRef_1);
+                final Procedure1<JvmGenericType> _function_2 = new Procedure1<JvmGenericType>() {
+                  public void apply(final JvmGenericType it) {
+                    StatemachineDSLJvmModelInferrer.this.generateButtons(it, ((StatemachineControlButton)control));
+                    it.setPackageName(pkgName);
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION);
+                  }
+                };
+                acceptor.<JvmGenericType>accept(controlCls, _function_2);
+              }
+            }
+            if (!_matched) {
+              if (control instanceof StatemachineControlField) {
+                _matched=true;
+                EList<JvmTypeReference> _superTypes_1 = controlCls.getSuperTypes();
+                JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(AbstractEventSource.class);
+                _superTypes_1.add(_typeRef_1);
+                final Procedure1<JvmGenericType> _function_2 = new Procedure1<JvmGenericType>() {
+                  public void apply(final JvmGenericType it) {
+                    StatemachineDSLJvmModelInferrer.this.generateFields(it, ((StatemachineControlField)control));
+                    it.setPackageName(pkgName);
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION);
+                  }
+                };
+                acceptor.<JvmGenericType>accept(controlCls, _function_2);
+              }
+            }
+            if (!_matched) {
+              if (control instanceof StatemachineControlDTO) {
+                _matched=true;
+                EList<JvmTypeReference> _superTypes_1 = controlCls.getSuperTypes();
+                JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(AbstractDataProvider.class);
+                _superTypes_1.add(_typeRef_1);
+                final Procedure1<JvmGenericType> _function_2 = new Procedure1<JvmGenericType>() {
+                  public void apply(final JvmGenericType it) {
+                    StatemachineDSLJvmModelInferrer.this.generateDTOs(it, ((StatemachineControlDTO)control));
+                    it.setPackageName(pkgName);
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION);
+                  }
+                };
+                acceptor.<JvmGenericType>accept(controlCls, _function_2);
+              }
+            }
+            if (!_matched) {
+              if (control instanceof StatemachineControlPeripheral) {
+                _matched=true;
+                EList<JvmTypeReference> _superTypes_1 = controlCls.getSuperTypes();
+                JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(AbstractPeripheralService.class);
+                _superTypes_1.add(_typeRef_1);
+                final Procedure1<JvmGenericType> _function_2 = new Procedure1<JvmGenericType>() {
+                  public void apply(final JvmGenericType it) {
+                    it.setPackageName(pkgName);
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION);
+                  }
+                };
+                acceptor.<JvmGenericType>accept(controlCls, _function_2);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+  public boolean generateSchedulers(final JvmGenericType controlCls, final StatemachineControlScheduler control) {
+    boolean _xblockexpression = false;
+    {
+      EList<StatemachineControlSchedulerAttribute> _schedulers = control.getSchedulers();
+      final Consumer<StatemachineControlSchedulerAttribute> _function = new Consumer<StatemachineControlSchedulerAttribute>() {
+        public void accept(final StatemachineControlSchedulerAttribute it) {
+          String _name = it.getName();
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Timer.class);
+          JvmField field = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _name, _typeRef);
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+          String _name_1 = it.getName();
+          String _plus = (_name_1 + "Scheduler");
+          JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Long.class);
+          JvmField _field = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _plus, _typeRef_1);
+          field = _field;
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members_1 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_1, field);
+        }
+      };
+      _schedulers.forEach(_function);
+      EList<StatemachineControlSchedulerAttribute> _schedulers_1 = control.getSchedulers();
+      final Consumer<StatemachineControlSchedulerAttribute> _function_1 = new Consumer<StatemachineControlSchedulerAttribute>() {
+        public void accept(final StatemachineControlSchedulerAttribute it) {
+          String _name = it.getName();
+          String _plus = (_name + "Scheduler");
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Long.class);
+          JvmOperation operation = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _plus, _typeRef);
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members, operation);
+          final StatemachineControlSchedulerAttribute scheduler = it;
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("set");
+          String _name_1 = it.getName();
+          String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+          _builder.append(_firstUpper, "");
+          _builder.append("Scheduler");
+          JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              it.setVisibility(JvmVisibility.PUBLIC);
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Long.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, "delay", _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("if (");
+                  String _name = scheduler.getName();
+                  _builder.append(_name, "");
+                  _builder.append(" != null) {");
+                  _builder.newLineIfNotEmpty();
+                  _builder.append("\t");
+                  String _name_1 = scheduler.getName();
+                  _builder.append(_name_1, "\t");
+                  _builder.append(".cancel();");
+                  _builder.newLineIfNotEmpty();
+                  _builder.append("\t");
+                  String _name_2 = scheduler.getName();
+                  _builder.append(_name_2, "\t");
+                  _builder.append(".purge();");
+                  _builder.newLineIfNotEmpty();
+                  _builder.append("}");
+                  _builder.newLine();
+                  String _name_3 = scheduler.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append(" = new Timer();");
+                  _builder.newLineIfNotEmpty();
+                  String _name_4 = scheduler.getName();
+                  _builder.append(_name_4, "");
+                  _builder.append(".schedule(new TaskEventSource(statemachine, new MessageEvent(EventType.TRIGGER, \"");
+                  StatemachineEvent _event = scheduler.getEvent();
+                  String _name_5 = _event.getName();
+                  _builder.append(_name_5, "");
+                  _builder.append("\")), this.");
+                  String _name_6 = scheduler.getName();
+                  _builder.append(_name_6, "");
+                  _builder.append("Scheduler = delay);");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder.toString(), _typeRef_1, _function);
+          operation = _method;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_1 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, operation);
+        }
+      };
+      _schedulers_1.forEach(_function_1);
+      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(Void.TYPE);
+      final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+        public void apply(final JvmOperation it) {
+          EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+          JvmAnnotationReference _annotationRef = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(Override.class);
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
+          it.setVisibility(JvmVisibility.PUBLIC);
+          final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+            public void apply(final ITreeAppendable it) {
+            }
+          };
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+        }
+      };
+      JvmOperation init = this._jvmTypesBuilder.toMethod(control, "init", _typeRef, _function_2);
+      EList<JvmMember> _members = controlCls.getMembers();
+      _xblockexpression = this._jvmTypesBuilder.<JvmOperation>operator_add(_members, init);
+    }
+    return _xblockexpression;
+  }
+  
+  public boolean generateButtons(final JvmGenericType controlCls, final StatemachineControlButton control) {
+    boolean _xblockexpression = false;
+    {
+      String _name = control.getName();
+      String _firstLower = StringExtensions.toFirstLower(_name);
+      String _plus = (_firstLower + "Enabled");
+      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(Boolean.class);
+      JvmField pad = this._jvmTypesBuilder.toField(control, _plus, _typeRef);
+      pad.setVisibility(JvmVisibility.PRIVATE);
+      EList<JvmMember> _members = controlCls.getMembers();
+      this._jvmTypesBuilder.<JvmField>operator_add(_members, pad);
+      EList<StatemachineControlButtonAttribute> _buttons = control.getButtons();
+      final Consumer<StatemachineControlButtonAttribute> _function = new Consumer<StatemachineControlButtonAttribute>() {
+        public void accept(final StatemachineControlButtonAttribute it) {
+          String _name = it.getName();
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Number.class);
+          JvmField field = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _name, _typeRef);
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+          String _name_1 = it.getName();
+          String _plus = (_name_1 + "Caption");
+          JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(String.class);
+          JvmField _field = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _plus, _typeRef_1);
+          field = _field;
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members_1 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_1, field);
+          String _name_2 = it.getName();
+          String _plus_1 = (_name_2 + "Enabled");
+          JvmTypeReference _typeRef_2 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+          JvmField _field_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _plus_1, _typeRef_2);
+          field = _field_1;
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members_2 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, field);
+          String _name_3 = it.getName();
+          String _plus_2 = (_name_3 + "Image");
+          JvmTypeReference _typeRef_3 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object.class);
+          JvmField _field_2 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _plus_2, _typeRef_3);
+          field = _field_2;
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members_3 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_3, field);
+        }
+      };
+      _buttons.forEach(_function);
+      EList<StatemachineControlButtonAttribute> _buttons_1 = control.getButtons();
+      final Consumer<StatemachineControlButtonAttribute> _function_1 = new Consumer<StatemachineControlButtonAttribute>() {
+        public void accept(final StatemachineControlButtonAttribute it) {
+          String _name = it.getName();
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Number.class);
+          JvmOperation operation = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _name, _typeRef);
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members, operation);
+          final StatemachineControlButtonAttribute button = it;
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("set");
+          String _name_1 = it.getName();
+          String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+          _builder.append(_firstUpper, "");
+          JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = button.getName();
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Number.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  {
+                    StatemachineControlButtonAttributeEvent _event = button.getEvent();
+                    if ((_event instanceof StatemachineControlButtonAttributeEventKeyboard)) {
+                      _builder.append("statemachine.processEvent(statemachine, new MessageEvent(EventType.KEYBOARD, \"");
+                      StatemachineControlButtonAttributeEvent _event_1 = button.getEvent();
+                      String _keystroke = ((StatemachineControlButtonAttributeEventKeyboard) _event_1).getKeystroke();
+                      _builder.append(_keystroke, "");
+                      _builder.append("\"));");
+                      _builder.newLineIfNotEmpty();
+                    } else {
+                      StatemachineControlButtonAttributeEvent _event_2 = button.getEvent();
+                      if ((_event_2 instanceof StatemachineControlButtonAttributeEventIdentity)) {
+                        _builder.append("statemachine.processEvent(statemachine, new MessageEvent(EventType.ID, \"");
+                        StatemachineControlButtonAttributeEvent _event_3 = button.getEvent();
+                        int _identity = ((StatemachineControlButtonAttributeEventIdentity) _event_3).getIdentity();
+                        _builder.append(_identity, "");
+                        _builder.append("\"));");
+                        _builder.newLineIfNotEmpty();
+                      } else {
+                        StatemachineControlButtonAttributeEvent _event_4 = button.getEvent();
+                        if ((_event_4 instanceof StatemachineControlButtonAttributeEventEvent)) {
+                          _builder.append("statemachine.processEvent(statemachine, new MessageEvent(EventType.TRIGGER, \"");
+                          StatemachineControlButtonAttributeEvent _event_5 = button.getEvent();
+                          StatemachineEvent _event_6 = ((StatemachineControlButtonAttributeEventEvent) _event_5).getEvent();
+                          String _name = _event_6.getName();
+                          _builder.append(_name, "");
+                          _builder.append("\"));");
+                          _builder.newLineIfNotEmpty();
+                        }
+                      }
+                    }
+                  }
+                  _builder.append("this.");
+                  String _name_1 = button.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append(" = ");
+                  String _name_2 = button.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append(";");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder.toString(), _typeRef_1, _function);
+          operation = _method;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_1 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, operation);
+          String _name_2 = it.getName();
+          String _plus = (_name_2 + "Caption");
+          JvmTypeReference _typeRef_2 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(String.class);
+          JvmOperation _getter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _plus, _typeRef_2);
+          operation = _getter;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_2 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
+          StringConcatenation _builder_1 = new StringConcatenation();
+          _builder_1.append("set");
+          String _name_3 = it.getName();
+          String _firstUpper_1 = StringExtensions.toFirstUpper(_name_3);
+          _builder_1.append(_firstUpper_1, "");
+          _builder_1.append("Caption");
+          JvmTypeReference _typeRef_3 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function_1 = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = button.getName();
+              String _plus = (_name + "Caption");
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(String.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _plus, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("pcs.firePropertyChange(\"");
+                  String _name = button.getName();
+                  _builder.append(_name, "");
+                  _builder.append("Caption\", this.");
+                  String _name_1 = button.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append("Caption, this.");
+                  String _name_2 = button.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append("Caption = ");
+                  String _name_3 = button.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append("Caption);");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_1.toString(), _typeRef_3, _function_1);
+          operation = _method_1;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_3 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, operation);
+          String _name_4 = it.getName();
+          String _plus_1 = (_name_4 + "Enabled");
+          JvmTypeReference _typeRef_4 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+          JvmOperation _getter_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _plus_1, _typeRef_4);
+          operation = _getter_1;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_4 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
+          StringConcatenation _builder_2 = new StringConcatenation();
+          _builder_2.append("set");
+          String _name_5 = it.getName();
+          String _firstUpper_2 = StringExtensions.toFirstUpper(_name_5);
+          _builder_2.append(_firstUpper_2, "");
+          _builder_2.append("Enabled");
+          JvmTypeReference _typeRef_5 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = button.getName();
+              String _plus = (_name + "Enabled");
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _plus, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("pcs.firePropertyChange(\"");
+                  String _name = button.getName();
+                  _builder.append(_name, "");
+                  _builder.append("Enabled\", this.");
+                  String _name_1 = button.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append("Enabled, this.");
+                  String _name_2 = button.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append("Enabled = ");
+                  String _name_3 = button.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append("Enabled);");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method_2 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_2.toString(), _typeRef_5, _function_2);
+          operation = _method_2;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_5 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, operation);
+          String _name_6 = it.getName();
+          String _plus_2 = (_name_6 + "Image");
+          JvmTypeReference _typeRef_6 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object.class);
+          JvmOperation _getter_2 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _plus_2, _typeRef_6);
+          operation = _getter_2;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_6 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, operation);
+          StringConcatenation _builder_3 = new StringConcatenation();
+          _builder_3.append("set");
+          String _name_7 = it.getName();
+          String _firstUpper_3 = StringExtensions.toFirstUpper(_name_7);
+          _builder_3.append(_firstUpper_3, "");
+          _builder_3.append("Image");
+          JvmTypeReference _typeRef_7 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function_3 = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = button.getName();
+              String _plus = (_name + "Image");
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _plus, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("pcs.firePropertyChange(\"");
+                  String _name = button.getName();
+                  _builder.append(_name, "");
+                  _builder.append("Image\", this.");
+                  String _name_1 = button.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append("Image, this.");
+                  String _name_2 = button.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append("Image = ");
+                  String _name_3 = button.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append("Image);");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method_3 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_3.toString(), _typeRef_7, _function_3);
+          operation = _method_3;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_7 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_7, operation);
+        }
+      };
+      _buttons_1.forEach(_function_1);
+      String _name_1 = control.getName();
+      String _firstLower_1 = StringExtensions.toFirstLower(_name_1);
+      String _plus_1 = (_firstLower_1 + "Enabled");
+      JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(Boolean.class);
+      JvmOperation getEnabled = this._jvmTypesBuilder.toGetter(control, _plus_1, _typeRef_1);
+      getEnabled.setVisibility(JvmVisibility.PUBLIC);
+      EList<JvmMember> _members_1 = controlCls.getMembers();
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, getEnabled);
+      StringConcatenation _builder = new StringConcatenation();
+      _builder.append("set");
+      String _name_2 = control.getName();
+      String _firstUpper = StringExtensions.toFirstUpper(_name_2);
+      _builder.append(_firstUpper, "");
+      _builder.append("Enabled");
+      JvmTypeReference _typeRef_2 = this._typeReferenceBuilder.typeRef(Void.TYPE);
+      final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+        public void apply(final JvmOperation it) {
+          EList<JvmFormalParameter> _parameters = it.getParameters();
+          String _name = control.getName();
+          String _firstLower = StringExtensions.toFirstLower(_name);
+          String _plus = (_firstLower + "Enabled");
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+          JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _plus, _typeRef);
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+          it.setVisibility(JvmVisibility.PUBLIC);
+          final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+            public void apply(final ITreeAppendable it) {
+              StringConcatenation _builder = new StringConcatenation();
+              {
+                EList<StatemachineControlButtonAttribute> _buttons = control.getButtons();
+                for(final StatemachineControlButtonAttribute button : _buttons) {
+                  _builder.append("set");
+                  String _name = button.getName();
+                  String _firstUpper = StringExtensions.toFirstUpper(_name);
+                  _builder.append(_firstUpper, "");
+                  _builder.append("Enabled(");
+                  String _name_1 = control.getName();
+                  String _firstLower = StringExtensions.toFirstLower(_name_1);
+                  _builder.append(_firstLower, "");
+                  _builder.append("Enabled);");
+                  _builder.newLineIfNotEmpty();
+                }
+              }
+              _builder.append("pcs.firePropertyChange(\"");
+              String _name_2 = control.getName();
+              String _firstLower_1 = StringExtensions.toFirstLower(_name_2);
+              _builder.append(_firstLower_1, "");
+              _builder.append("Enabled\", this.");
+              String _name_3 = control.getName();
+              String _firstLower_2 = StringExtensions.toFirstLower(_name_3);
+              _builder.append(_firstLower_2, "");
+              _builder.append("Enabled, this.");
+              String _name_4 = control.getName();
+              String _firstLower_3 = StringExtensions.toFirstLower(_name_4);
+              _builder.append(_firstLower_3, "");
+              _builder.append("Enabled = ");
+              String _name_5 = control.getName();
+              String _firstLower_4 = StringExtensions.toFirstLower(_name_5);
+              _builder.append(_firstLower_4, "");
+              _builder.append("Enabled);");
+              _builder.newLineIfNotEmpty();
+              it.append(_builder);
+            }
+          };
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+        }
+      };
+      JvmOperation setEnabled = this._jvmTypesBuilder.toMethod(control, _builder.toString(), _typeRef_2, _function_2);
+      setEnabled.setVisibility(JvmVisibility.PUBLIC);
+      EList<JvmMember> _members_2 = controlCls.getMembers();
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, setEnabled);
+      boolean _hasImages = false;
+      EList<StatemachineControlButtonAttribute> _buttons_2 = control.getButtons();
+      for (final StatemachineControlButtonAttribute button : _buttons_2) {
+        boolean _isHasImage = button.isHasImage();
+        if (_isHasImage) {
+          _hasImages = true;
+        }
+      }
+      final boolean hasImages = _hasImages;
+      JvmTypeReference _typeRef_3 = this._typeReferenceBuilder.typeRef(Void.TYPE);
+      final Procedure1<JvmOperation> _function_3 = new Procedure1<JvmOperation>() {
+        public void apply(final JvmOperation it) {
+          EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+          JvmAnnotationReference _annotationRef = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(Override.class);
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
+          it.setVisibility(JvmVisibility.PUBLIC);
+          final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+            public void apply(final ITreeAppendable it) {
+              StringConcatenation _builder = new StringConcatenation();
+              _builder.append("super.init();");
+              _builder.newLine();
+              _builder.append("set");
+              String _name = control.getName();
+              String _firstUpper = StringExtensions.toFirstUpper(_name);
+              _builder.append(_firstUpper, "");
+              _builder.append("Enabled(false);");
+              _builder.newLineIfNotEmpty();
+              {
+                if (hasImages) {
+                  {
+                    EList<StatemachineControlButtonAttribute> _buttons = control.getButtons();
+                    for(final StatemachineControlButtonAttribute button : _buttons) {
+                      {
+                        boolean _isHasImage = button.isHasImage();
+                        if (_isHasImage) {
+                          _builder.append("set");
+                          String _name_1 = button.getName();
+                          String _firstUpper_1 = StringExtensions.toFirstUpper(_name_1);
+                          _builder.append(_firstUpper_1, "");
+                          _builder.append("Caption(null);");
+                          _builder.newLineIfNotEmpty();
+                        }
+                      }
+                    }
+                  }
+                  _builder.append("if(statemachine != null) {");
+                  _builder.newLine();
+                  {
+                    EList<StatemachineControlButtonAttribute> _buttons_1 = control.getButtons();
+                    for(final StatemachineControlButtonAttribute button_1 : _buttons_1) {
+                      {
+                        boolean _and = false;
+                        boolean _isHasImage_1 = button_1.isHasImage();
+                        if (!_isHasImage_1) {
+                          _and = false;
+                        } else {
+                          String _image = button_1.getImage();
+                          int _length = _image.length();
+                          boolean _greaterThan = (_length > 0);
+                          _and = _greaterThan;
+                        }
+                        if (_and) {
+                          _builder.append("\tset");
+                          String _name_2 = button_1.getName();
+                          String _firstUpper_2 = StringExtensions.toFirstUpper(_name_2);
+                          _builder.append(_firstUpper_2, "");
+                          _builder.append("Image(statemachine.getThemeResourceService().getThemeResource(\"");
+                          String _image_1 = button_1.getImage();
+                          _builder.append(_image_1, "");
+                          _builder.append("\", ThemeResourceType.ICON));");
+                          _builder.newLineIfNotEmpty();
+                        }
+                      }
+                    }
+                  }
+                  _builder.append("}");
+                  _builder.newLine();
+                }
+              }
+              it.append(_builder);
+            }
+          };
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+        }
+      };
+      JvmOperation init = this._jvmTypesBuilder.toMethod(control, "init", _typeRef_3, _function_3);
+      EList<JvmMember> _members_3 = controlCls.getMembers();
+      _xblockexpression = this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, init);
+    }
+    return _xblockexpression;
+  }
+  
+  public boolean generateFields(final JvmGenericType controlCls, final StatemachineControlField control) {
+    boolean _xblockexpression = false;
+    {
+      EList<StatemachineControlFieldAttribute> _fields = control.getFields();
+      final Consumer<StatemachineControlFieldAttribute> _function = new Consumer<StatemachineControlFieldAttribute>() {
+        public void accept(final StatemachineControlFieldAttribute it) {
+          String _name = it.getName();
+          Class<?> _decodeType = StatemachineDSLJvmModelInferrer.this.decodeType(it);
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(_decodeType);
+          JvmField field = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _name, _typeRef);
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+          StatemachineFieldType _attributeType = it.getAttributeType();
+          StatemachineInternalType _attributeType_1 = _attributeType.getAttributeType();
+          boolean _equals = Objects.equal(_attributeType_1, StatemachineInternalType.SUGGESTTEXT);
+          if (_equals) {
+            String _name_1 = it.getName();
+            String _plus = (_name_1 + "Event");
+            JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(YSuggestTextFieldEvents.class);
+            JvmField _field = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _plus, _typeRef_1);
+            field = _field;
+            field.setVisibility(JvmVisibility.PRIVATE);
+            EList<JvmMember> _members_1 = controlCls.getMembers();
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_1, field);
+          }
+          String _name_2 = it.getName();
+          String _plus_1 = (_name_2 + "Enabled");
+          JvmTypeReference _typeRef_2 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+          JvmField _field_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _plus_1, _typeRef_2);
+          field = _field_1;
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members_2 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, field);
+        }
+      };
+      _fields.forEach(_function);
+      EList<StatemachineControlFieldLayout> _layouts = control.getLayouts();
+      final Consumer<StatemachineControlFieldLayout> _function_1 = new Consumer<StatemachineControlFieldLayout>() {
+        public void accept(final StatemachineControlFieldLayout it) {
+          String _name = it.getName();
+          String _plus = (_name + "Enabled");
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+          JvmField layout = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _plus, _typeRef);
+          layout.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, layout);
+        }
+      };
+      _layouts.forEach(_function_1);
+      EList<StatemachineControlFieldAttribute> _fields_1 = control.getFields();
+      final Consumer<StatemachineControlFieldAttribute> _function_2 = new Consumer<StatemachineControlFieldAttribute>() {
+        public void accept(final StatemachineControlFieldAttribute it) {
+          String _name = it.getName();
+          Class<?> _decodeType = StatemachineDSLJvmModelInferrer.this.decodeType(it);
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(_decodeType);
+          JvmOperation operation = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _name, _typeRef);
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members, operation);
+          final StatemachineControlFieldAttribute field = it;
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("set");
+          String _name_1 = it.getName();
+          String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+          _builder.append(_firstUpper, "");
+          JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = field.getName();
+              Class<?> _decodeType = StatemachineDSLJvmModelInferrer.this.decodeType(field);
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(_decodeType);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  String _decodeSetter = StatemachineDSLJvmModelInferrer.this.decodeSetter(field);
+                  _builder.append(_decodeSetter, "");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder.toString(), _typeRef_1, _function);
+          operation = _method;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_1 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, operation);
+          String _name_2 = it.getName();
+          String _plus = (_name_2 + "Enabled");
+          JvmTypeReference _typeRef_2 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+          JvmOperation _getter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _plus, _typeRef_2);
+          operation = _getter;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_2 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
+          StringConcatenation _builder_1 = new StringConcatenation();
+          _builder_1.append("set");
+          String _name_3 = it.getName();
+          String _firstUpper_1 = StringExtensions.toFirstUpper(_name_3);
+          _builder_1.append(_firstUpper_1, "");
+          _builder_1.append("Enabled");
+          JvmTypeReference _typeRef_3 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function_1 = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = field.getName();
+              String _plus = (_name + "Enabled");
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _plus, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("pcs.firePropertyChange(\"");
+                  String _name = field.getName();
+                  _builder.append(_name, "");
+                  _builder.append("Enabled\", this.");
+                  String _name_1 = field.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append("Enabled, this.");
+                  String _name_2 = field.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append("Enabled = ");
+                  String _name_3 = field.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append("Enabled);");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_1.toString(), _typeRef_3, _function_1);
+          operation = _method_1;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_3 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, operation);
+          StatemachineFieldType _attributeType = it.getAttributeType();
+          StatemachineInternalType _attributeType_1 = _attributeType.getAttributeType();
+          boolean _equals = Objects.equal(_attributeType_1, StatemachineInternalType.SUGGESTTEXT);
+          if (_equals) {
+            String _name_4 = it.getName();
+            String _plus_1 = (_name_4 + "Event");
+            JvmTypeReference _typeRef_4 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(YSuggestTextFieldEvents.class);
+            JvmOperation _getter_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _plus_1, _typeRef_4);
+            operation = _getter_1;
+            operation.setVisibility(JvmVisibility.PUBLIC);
+            EList<JvmMember> _members_4 = controlCls.getMembers();
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
+            final StatemachineControlFieldAttribute eventfield = it;
+            StringConcatenation _builder_2 = new StringConcatenation();
+            _builder_2.append("set");
+            String _name_5 = it.getName();
+            String _firstUpper_2 = StringExtensions.toFirstUpper(_name_5);
+            _builder_2.append(_firstUpper_2, "");
+            _builder_2.append("Event");
+            JvmTypeReference _typeRef_5 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+            final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+              public void apply(final JvmOperation it) {
+                EList<JvmFormalParameter> _parameters = it.getParameters();
+                String _name = eventfield.getName();
+                String _plus = (_name + "Event");
+                JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(YSuggestTextFieldEvents.class);
+                JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _plus, _typeRef);
+                StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                it.setVisibility(JvmVisibility.PUBLIC);
+                final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                  public void apply(final ITreeAppendable it) {
+                    StringConcatenation _builder = new StringConcatenation();
+                    _builder.append("pcs.firePropertyChange(\"");
+                    String _name = field.getName();
+                    _builder.append(_name, "");
+                    _builder.append("Event\", this.");
+                    String _name_1 = field.getName();
+                    _builder.append(_name_1, "");
+                    _builder.append("Event, this.");
+                    String _name_2 = field.getName();
+                    _builder.append(_name_2, "");
+                    _builder.append("Event = ");
+                    String _name_3 = field.getName();
+                    _builder.append(_name_3, "");
+                    _builder.append("Event);");
+                    it.append(_builder);
+                  }
+                };
+                StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+              }
+            };
+            JvmOperation _method_2 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_2.toString(), _typeRef_5, _function_2);
+            operation = _method_2;
+            operation.setVisibility(JvmVisibility.PUBLIC);
+            EList<JvmMember> _members_5 = controlCls.getMembers();
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, operation);
+          }
+        }
+      };
+      _fields_1.forEach(_function_2);
+      EList<StatemachineControlFieldLayout> _layouts_1 = control.getLayouts();
+      final Consumer<StatemachineControlFieldLayout> _function_3 = new Consumer<StatemachineControlFieldLayout>() {
+        public void accept(final StatemachineControlFieldLayout it) {
+          String _name = it.getName();
+          String _plus = (_name + "Enabled");
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+          JvmOperation operation = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toGetter(control, _plus, _typeRef);
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members, operation);
+          final StatemachineControlFieldLayout layout = it;
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("set");
+          String _name_1 = it.getName();
+          String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+          _builder.append(_firstUpper, "");
+          _builder.append("Enabled");
+          JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = layout.getName();
+              String _plus = (_name + "Enabled");
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Boolean.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _plus, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("pcs.firePropertyChange(\"");
+                  String _name = layout.getName();
+                  _builder.append(_name, "");
+                  _builder.append("Enabled\", this.");
+                  String _name_1 = layout.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append("Enabled, this.");
+                  String _name_2 = layout.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append("Enabled = ");
+                  String _name_3 = layout.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append("Enabled);");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder.toString(), _typeRef_1, _function);
+          operation = _method;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_1 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, operation);
+        }
+      };
+      _layouts_1.forEach(_function_3);
+      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(Void.TYPE);
+      final Procedure1<JvmOperation> _function_4 = new Procedure1<JvmOperation>() {
+        public void apply(final JvmOperation it) {
+          EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+          JvmAnnotationReference _annotationRef = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(Override.class);
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
+          it.setVisibility(JvmVisibility.PUBLIC);
+          final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+            public void apply(final ITreeAppendable it) {
+              StringConcatenation _builder = new StringConcatenation();
+              _builder.append("super.init();");
+              _builder.newLine();
+              {
+                EList<StatemachineControlFieldAttribute> _fields = control.getFields();
+                for(final StatemachineControlFieldAttribute field : _fields) {
+                  _builder.append("pcs.firePropertyChange(\"");
+                  String _name = field.getName();
+                  _builder.append(_name, "");
+                  _builder.append("Enabled\", this.");
+                  String _name_1 = field.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append("Enabled, this.");
+                  String _name_2 = field.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append("Enabled = false);");
+                  _builder.newLineIfNotEmpty();
+                }
+              }
+              {
+                EList<StatemachineControlFieldLayout> _layouts = control.getLayouts();
+                for(final StatemachineControlFieldLayout layout : _layouts) {
+                  _builder.append("pcs.firePropertyChange(\"");
+                  String _name_3 = layout.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append("Enabled\", this.");
+                  String _name_4 = layout.getName();
+                  _builder.append(_name_4, "");
+                  _builder.append("Enabled, this.");
+                  String _name_5 = layout.getName();
+                  _builder.append(_name_5, "");
+                  _builder.append("Enabled = false);");
+                  _builder.newLineIfNotEmpty();
+                }
+              }
+              it.append(_builder);
+            }
+          };
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+        }
+      };
+      JvmOperation init = this._jvmTypesBuilder.toMethod(control, "init", _typeRef, _function_4);
+      EList<JvmMember> _members = controlCls.getMembers();
+      _xblockexpression = this._jvmTypesBuilder.<JvmOperation>operator_add(_members, init);
+    }
+    return _xblockexpression;
+  }
+  
+  public boolean generateDTOs(final JvmGenericType controlCls, final StatemachineControlDTO control) {
+    boolean _xblockexpression = false;
+    {
+      EList<StatemachineControlDTOAttribute> _dtos = control.getDtos();
+      final Consumer<StatemachineControlDTOAttribute> _function = new Consumer<StatemachineControlDTOAttribute>() {
+        public void accept(final StatemachineControlDTOAttribute it) {
+          String _name = it.getName();
+          StatemachineDTOType _attributeType = it.getAttributeType();
+          LDto _attributeType_1 = _attributeType.getAttributeType();
+          QualifiedName _fullyQualifiedName = StatemachineDSLJvmModelInferrer.this._iQualifiedNameProvider.getFullyQualifiedName(_attributeType_1);
+          String _string = _fullyQualifiedName.toString();
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(_string);
+          JvmField field = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toField(control, _name, _typeRef);
+          field.setVisibility(JvmVisibility.PRIVATE);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+        }
+      };
+      _dtos.forEach(_function);
+      EList<StatemachineControlDTOAttribute> _dtos_1 = control.getDtos();
+      final Consumer<StatemachineControlDTOAttribute> _function_1 = new Consumer<StatemachineControlDTOAttribute>() {
+        public void accept(final StatemachineControlDTOAttribute it) {
+          final StatemachineControlDTOAttribute dto = it;
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("get");
+          StatemachineDTOType _attributeType = it.getAttributeType();
+          LDto _attributeType_1 = _attributeType.getAttributeType();
+          String _name = _attributeType_1.getName();
+          String _firstUpper = StringExtensions.toFirstUpper(_name);
+          _builder.append(_firstUpper, "");
+          JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IDto.class);
+          final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("return ");
+                  String _name = dto.getName();
+                  _builder.append(_name, "");
+                  _builder.append(";");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation operation = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder.toString(), _typeRef, _function);
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members, operation);
+          StatemachineDTOType _attributeType_2 = it.getAttributeType();
+          LDto _attributeType_3 = _attributeType_2.getAttributeType();
+          LDtoAbstractAttribute _primaryKeyAttribute = _attributeType_3.getPrimaryKeyAttribute();
+          boolean _notEquals = (!Objects.equal(_primaryKeyAttribute, null));
+          if (_notEquals) {
+            StringConcatenation _builder_1 = new StringConcatenation();
+            _builder_1.append("get");
+            StatemachineDTOType _attributeType_4 = it.getAttributeType();
+            LDto _attributeType_5 = _attributeType_4.getAttributeType();
+            String _name_1 = _attributeType_5.getName();
+            String _firstUpper_1 = StringExtensions.toFirstUpper(_name_1);
+            _builder_1.append(_firstUpper_1, "");
+            StatemachineDTOType _attributeType_6 = it.getAttributeType();
+            LDto _attributeType_7 = _attributeType_6.getAttributeType();
+            String _idAttributeName = _attributeType_7.getIdAttributeName();
+            String _firstUpper_2 = StringExtensions.toFirstUpper(_idAttributeName);
+            _builder_1.append(_firstUpper_2, "");
+            StatemachineDTOType _attributeType_8 = it.getAttributeType();
+            LDto _attributeType_9 = _attributeType_8.getAttributeType();
+            LScalarType _idAttributeType = _attributeType_9.getIdAttributeType();
+            String _name_2 = _idAttributeType.getName();
+            JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(_name_2);
+            final Procedure1<JvmOperation> _function_1 = new Procedure1<JvmOperation>() {
+              public void apply(final JvmOperation it) {
+                it.setVisibility(JvmVisibility.PUBLIC);
+                final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                  public void apply(final ITreeAppendable it) {
+                    StringConcatenation _builder = new StringConcatenation();
+                    _builder.append("return ");
+                    String _name = dto.getName();
+                    _builder.append(_name, "");
+                    _builder.append(".get");
+                    StatemachineDTOType _attributeType = dto.getAttributeType();
+                    LDto _attributeType_1 = _attributeType.getAttributeType();
+                    String _idAttributeName = _attributeType_1.getIdAttributeName();
+                    String _firstUpper = StringExtensions.toFirstUpper(_idAttributeName);
+                    _builder.append(_firstUpper, "");
+                    _builder.append("();");
+                    it.append(_builder);
+                  }
+                };
+                StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+              }
+            };
+            JvmOperation _method = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_1.toString(), _typeRef_1, _function_1);
+            operation = _method;
+            operation.setVisibility(JvmVisibility.PUBLIC);
+            EList<JvmMember> _members_1 = controlCls.getMembers();
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, operation);
+          }
+          StatemachineDTOType _attributeType_10 = it.getAttributeType();
+          LDto _attributeType_11 = _attributeType_10.getAttributeType();
+          EList<LDtoFeature> _features = _attributeType_11.getFeatures();
+          for (final LDtoFeature f : _features) {
+            {
+              if ((f instanceof LDtoInheritedAttribute)) {
+                LAttribute _inheritedFeature = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                LScalarType _type = _inheritedFeature.getType();
+                String typeName = _type.getName();
+                LAttribute _inheritedFeature_1 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                LScalarType _type_1 = _inheritedFeature_1.getType();
+                boolean _matched = false;
+                if (!_matched) {
+                  if (_type_1 instanceof LDataType) {
+                    _matched=true;
+                    LAttribute _inheritedFeature_2 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                    LScalarType _type_2 = _inheritedFeature_2.getType();
+                    JvmTypeReference _jvmTypeReference = ((LDataType) _type_2).getJvmTypeReference();
+                    boolean _notEquals_1 = (!Objects.equal(_jvmTypeReference, null));
+                    if (_notEquals_1) {
+                      LAttribute _inheritedFeature_3 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                      LScalarType _type_3 = _inheritedFeature_3.getType();
+                      JvmTypeReference _jvmTypeReference_1 = ((LDataType) _type_3).getJvmTypeReference();
+                      String _simpleName = _jvmTypeReference_1.getSimpleName();
+                      typeName = _simpleName;
+                    }
+                  }
+                }
+                if (!_matched) {
+                  if (_type_1 instanceof LEnum) {
+                    _matched=true;
+                    EObject _eContainer = ((LDtoInheritedAttribute)f).eContainer();
+                    QualifiedName _fullyQualifiedName = StatemachineDSLJvmModelInferrer.this._iQualifiedNameProvider.getFullyQualifiedName(_eContainer);
+                    String _string = _fullyQualifiedName.toString();
+                    EObject _eContainer_1 = ((LDtoInheritedAttribute)f).eContainer();
+                    QualifiedName _fullyQualifiedName_1 = StatemachineDSLJvmModelInferrer.this._iQualifiedNameProvider.getFullyQualifiedName(_eContainer_1);
+                    String _lastSegment = _fullyQualifiedName_1.getLastSegment();
+                    String _string_1 = _lastSegment.toString();
+                    LAttribute _inheritedFeature_2 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                    LScalarType _type_2 = _inheritedFeature_2.getType();
+                    String _name_3 = ((LEnum) _type_2).getName();
+                    String _replace = _string.replace(_string_1, _name_3);
+                    typeName = _replace;
+                  }
+                }
+                boolean isTimestamp = false;
+                boolean _equals = typeName.equals("Timestamp");
+                if (_equals) {
+                  isTimestamp = true;
+                  typeName = "org.joda.time.DateTime";
+                }
+                final String _typeName = typeName;
+                final boolean _isTimestamp = isTimestamp;
+                StringConcatenation _builder_2 = new StringConcatenation();
+                _builder_2.append("get");
+                StatemachineDTOType _attributeType_12 = it.getAttributeType();
+                LDto _attributeType_13 = _attributeType_12.getAttributeType();
+                String _name_3 = _attributeType_13.getName();
+                String _firstUpper_3 = StringExtensions.toFirstUpper(_name_3);
+                _builder_2.append(_firstUpper_3, "");
+                LAttribute _inheritedFeature_2 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                String _name_4 = _inheritedFeature_2.getName();
+                String _firstUpper_4 = StringExtensions.toFirstUpper(_name_4);
+                _builder_2.append(_firstUpper_4, "");
+                JvmTypeReference _typeRef_2 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(typeName);
+                final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+                  public void apply(final JvmOperation it) {
+                    it.setVisibility(JvmVisibility.PUBLIC);
+                    final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                      public void apply(final ITreeAppendable it) {
+                        StringConcatenation _builder = new StringConcatenation();
+                        _builder.append("if(");
+                        String _name = dto.getName();
+                        _builder.append(_name, "");
+                        _builder.append("!=null) {");
+                        _builder.newLineIfNotEmpty();
+                        _builder.append("\t");
+                        _builder.append("return ");
+                        {
+                          if (_isTimestamp) {
+                            _builder.append("new DateTime(");
+                          }
+                        }
+                        String _name_1 = dto.getName();
+                        _builder.append(_name_1, "\t");
+                        _builder.append(".get");
+                        LAttribute _inheritedFeature = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                        String _name_2 = _inheritedFeature.getName();
+                        String _firstUpper = StringExtensions.toFirstUpper(_name_2);
+                        _builder.append(_firstUpper, "\t");
+                        _builder.append("()");
+                        {
+                          if (_isTimestamp) {
+                            _builder.append(")");
+                          }
+                        }
+                        _builder.append(";");
+                        _builder.newLineIfNotEmpty();
+                        _builder.append("} else {");
+                        _builder.newLine();
+                        _builder.append("\t");
+                        _builder.append("return null;");
+                        _builder.newLine();
+                        _builder.append("}");
+                        it.append(_builder);
+                      }
+                    };
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+                  }
+                };
+                JvmOperation _method_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_2.toString(), _typeRef_2, _function_2);
+                operation = _method_1;
+                EList<JvmMember> _members_2 = controlCls.getMembers();
+                StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
+                StringConcatenation _builder_3 = new StringConcatenation();
+                _builder_3.append("set");
+                StatemachineDTOType _attributeType_14 = it.getAttributeType();
+                LDto _attributeType_15 = _attributeType_14.getAttributeType();
+                String _name_5 = _attributeType_15.getName();
+                String _firstUpper_5 = StringExtensions.toFirstUpper(_name_5);
+                _builder_3.append(_firstUpper_5, "");
+                LAttribute _inheritedFeature_3 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                String _name_6 = _inheritedFeature_3.getName();
+                String _firstUpper_6 = StringExtensions.toFirstUpper(_name_6);
+                _builder_3.append(_firstUpper_6, "");
+                JvmTypeReference _typeRef_3 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+                final Procedure1<JvmOperation> _function_3 = new Procedure1<JvmOperation>() {
+                  public void apply(final JvmOperation it) {
+                    it.setVisibility(JvmVisibility.PUBLIC);
+                    EList<JvmFormalParameter> _parameters = it.getParameters();
+                    LAttribute _inheritedFeature = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                    String _name = _inheritedFeature.getName();
+                    JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(_typeName);
+                    JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                    final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                      public void apply(final ITreeAppendable it) {
+                        StringConcatenation _builder = new StringConcatenation();
+                        String _name = dto.getName();
+                        _builder.append(_name, "");
+                        _builder.append(".set");
+                        LAttribute _inheritedFeature = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                        String _name_1 = _inheritedFeature.getName();
+                        String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+                        _builder.append(_firstUpper, "");
+                        _builder.append("(");
+                        LAttribute _inheritedFeature_1 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+                        String _name_2 = _inheritedFeature_1.getName();
+                        _builder.append(_name_2, "");
+                        {
+                          if (_isTimestamp) {
+                            _builder.append(".toDate()");
+                          }
+                        }
+                        _builder.append(");");
+                        it.append(_builder);
+                      }
+                    };
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+                  }
+                };
+                JvmOperation _method_2 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_3.toString(), _typeRef_3, _function_3);
+                operation = _method_2;
+                EList<JvmMember> _members_3 = controlCls.getMembers();
+                StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, operation);
+              }
+              if ((f instanceof LDtoInheritedReference)) {
+                LReference _inheritedFeature_4 = ((LDtoInheritedReference)f).getInheritedFeature();
+                boolean _isToMany = StatemachineDSLJvmModelInferrer.this._modelExtensions.isToMany(_inheritedFeature_4);
+                if (_isToMany) {
+                  EList<StatemachineControlDTOAttribute> _dtos = control.getDtos();
+                  LReference _inheritedFeature_5 = ((LDtoInheritedReference)f).getInheritedFeature();
+                  LType _type_2 = StatemachineDSLJvmModelInferrer.this._modelExtensions.type(_inheritedFeature_5);
+                  String _name_7 = ((LEntity) _type_2).getName();
+                  boolean _containsType = StatemachineDSLJvmModelInferrer.this.containsType(_dtos, _name_7);
+                  if (_containsType) {
+                    LReference _inheritedFeature_6 = ((LDtoInheritedReference)f).getInheritedFeature();
+                    LType _type_3 = StatemachineDSLJvmModelInferrer.this._modelExtensions.type(_inheritedFeature_6);
+                    String _name_8 = _type_3.getName();
+                    final String typeName_1 = (_name_8 + "Dto");
+                    EList<JvmMember> _members_4 = controlCls.getMembers();
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
+                    StringConcatenation _builder_4 = new StringConcatenation();
+                    _builder_4.append("addTo");
+                    StatemachineDTOType _attributeType_16 = it.getAttributeType();
+                    LDto _attributeType_17 = _attributeType_16.getAttributeType();
+                    String _name_9 = _attributeType_17.getName();
+                    String _firstUpper_7 = StringExtensions.toFirstUpper(_name_9);
+                    _builder_4.append(_firstUpper_7, "");
+                    LReference _inheritedFeature_7 = ((LDtoInheritedReference)f).getInheritedFeature();
+                    String _name_10 = _inheritedFeature_7.getName();
+                    String _firstUpper_8 = StringExtensions.toFirstUpper(_name_10);
+                    _builder_4.append(_firstUpper_8, "");
+                    JvmTypeReference _typeRef_4 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+                    final Procedure1<JvmOperation> _function_4 = new Procedure1<JvmOperation>() {
+                      public void apply(final JvmOperation it) {
+                        it.setVisibility(JvmVisibility.PUBLIC);
+                        EList<JvmFormalParameter> _parameters = it.getParameters();
+                        LReference _inheritedFeature = ((LDtoInheritedReference)f).getInheritedFeature();
+                        String _name = _inheritedFeature.getName();
+                        JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IDto.class);
+                        JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+                        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                          public void apply(final ITreeAppendable it) {
+                            StringConcatenation _builder = new StringConcatenation();
+                            String _name = dto.getName();
+                            _builder.append(_name, "");
+                            _builder.append(".addTo");
+                            LReference _inheritedFeature = ((LDtoInheritedReference)f).getInheritedFeature();
+                            String _name_1 = _inheritedFeature.getName();
+                            String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+                            _builder.append(_firstUpper, "");
+                            _builder.append("((");
+                            LReference _inheritedFeature_1 = ((LDtoInheritedReference)f).getInheritedFeature();
+                            LType _type = StatemachineDSLJvmModelInferrer.this._modelExtensions.type(_inheritedFeature_1);
+                            String _name_2 = _type.getName();
+                            String _string = _name_2.toString();
+                            _builder.append(_string, "");
+                            _builder.append("Dto)");
+                            LReference _inheritedFeature_2 = ((LDtoInheritedReference)f).getInheritedFeature();
+                            String _name_3 = _inheritedFeature_2.getName();
+                            _builder.append(_name_3, "");
+                            _builder.append(");");
+                            it.append(_builder);
+                          }
+                        };
+                        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+                      }
+                    };
+                    JvmOperation _method_3 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_4.toString(), _typeRef_4, _function_4);
+                    operation = _method_3;
+                    EList<JvmMember> _members_5 = controlCls.getMembers();
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, operation);
+                    StringConcatenation _builder_5 = new StringConcatenation();
+                    _builder_5.append("removeFrom");
+                    StatemachineDTOType _attributeType_18 = it.getAttributeType();
+                    LDto _attributeType_19 = _attributeType_18.getAttributeType();
+                    String _name_11 = _attributeType_19.getName();
+                    String _firstUpper_9 = StringExtensions.toFirstUpper(_name_11);
+                    _builder_5.append(_firstUpper_9, "");
+                    LReference _inheritedFeature_8 = ((LDtoInheritedReference)f).getInheritedFeature();
+                    String _name_12 = _inheritedFeature_8.getName();
+                    String _firstUpper_10 = StringExtensions.toFirstUpper(_name_12);
+                    _builder_5.append(_firstUpper_10, "");
+                    JvmTypeReference _typeRef_5 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+                    final Procedure1<JvmOperation> _function_5 = new Procedure1<JvmOperation>() {
+                      public void apply(final JvmOperation it) {
+                        it.setVisibility(JvmVisibility.PUBLIC);
+                        EList<JvmFormalParameter> _parameters = it.getParameters();
+                        LReference _inheritedFeature = ((LDtoInheritedReference)f).getInheritedFeature();
+                        String _name = _inheritedFeature.getName();
+                        JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IDto.class);
+                        JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+                        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                          public void apply(final ITreeAppendable it) {
+                            StringConcatenation _builder = new StringConcatenation();
+                            String _name = dto.getName();
+                            _builder.append(_name, "");
+                            _builder.append(".removeFrom");
+                            LReference _inheritedFeature = ((LDtoInheritedReference)f).getInheritedFeature();
+                            String _name_1 = _inheritedFeature.getName();
+                            String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+                            _builder.append(_firstUpper, "");
+                            _builder.append("((");
+                            LReference _inheritedFeature_1 = ((LDtoInheritedReference)f).getInheritedFeature();
+                            LType _type = StatemachineDSLJvmModelInferrer.this._modelExtensions.type(_inheritedFeature_1);
+                            String _name_2 = _type.getName();
+                            String _string = _name_2.toString();
+                            _builder.append(_string, "");
+                            _builder.append("Dto)");
+                            LReference _inheritedFeature_2 = ((LDtoInheritedReference)f).getInheritedFeature();
+                            String _name_3 = _inheritedFeature_2.getName();
+                            _builder.append(_name_3, "");
+                            _builder.append(");");
+                            it.append(_builder);
+                          }
+                        };
+                        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+                      }
+                    };
+                    JvmOperation _method_4 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_5.toString(), _typeRef_5, _function_5);
+                    operation = _method_4;
+                    EList<JvmMember> _members_6 = controlCls.getMembers();
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, operation);
+                  }
+                } else {
+                  EList<StatemachineControlDTOAttribute> _dtos_1 = control.getDtos();
+                  LReference _inheritedFeature_9 = ((LDtoInheritedReference)f).getInheritedFeature();
+                  LType _type_4 = StatemachineDSLJvmModelInferrer.this._modelExtensions.type(_inheritedFeature_9);
+                  String _name_13 = ((LEntity) _type_4).getName();
+                  boolean _containsType_1 = StatemachineDSLJvmModelInferrer.this.containsType(_dtos_1, _name_13);
+                  if (_containsType_1) {
+                    LReference _inheritedFeature_10 = ((LDtoInheritedReference)f).getInheritedFeature();
+                    LType _type_5 = StatemachineDSLJvmModelInferrer.this._modelExtensions.type(_inheritedFeature_10);
+                    String _name_14 = _type_5.getName();
+                    final String typeName_2 = (_name_14 + "Dto");
+                    EList<JvmMember> _members_7 = controlCls.getMembers();
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_7, operation);
+                    StringConcatenation _builder_6 = new StringConcatenation();
+                    _builder_6.append("set");
+                    StatemachineDTOType _attributeType_20 = it.getAttributeType();
+                    LDto _attributeType_21 = _attributeType_20.getAttributeType();
+                    String _name_15 = _attributeType_21.getName();
+                    String _firstUpper_11 = StringExtensions.toFirstUpper(_name_15);
+                    _builder_6.append(_firstUpper_11, "");
+                    LReference _inheritedFeature_11 = ((LDtoInheritedReference)f).getInheritedFeature();
+                    String _name_16 = _inheritedFeature_11.getName();
+                    String _firstUpper_12 = StringExtensions.toFirstUpper(_name_16);
+                    _builder_6.append(_firstUpper_12, "");
+                    JvmTypeReference _typeRef_6 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+                    final Procedure1<JvmOperation> _function_6 = new Procedure1<JvmOperation>() {
+                      public void apply(final JvmOperation it) {
+                        it.setVisibility(JvmVisibility.PUBLIC);
+                        EList<JvmFormalParameter> _parameters = it.getParameters();
+                        LReference _inheritedFeature = ((LDtoInheritedReference)f).getInheritedFeature();
+                        String _name = _inheritedFeature.getName();
+                        JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IDto.class);
+                        JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+                        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                          public void apply(final ITreeAppendable it) {
+                            StringConcatenation _builder = new StringConcatenation();
+                            String _name = dto.getName();
+                            _builder.append(_name, "");
+                            _builder.append(".set");
+                            LReference _inheritedFeature = ((LDtoInheritedReference)f).getInheritedFeature();
+                            String _name_1 = _inheritedFeature.getName();
+                            String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+                            _builder.append(_firstUpper, "");
+                            _builder.append("((");
+                            LReference _inheritedFeature_1 = ((LDtoInheritedReference)f).getInheritedFeature();
+                            LType _type = StatemachineDSLJvmModelInferrer.this._modelExtensions.type(_inheritedFeature_1);
+                            String _name_2 = _type.getName();
+                            String _string = _name_2.toString();
+                            _builder.append(_string, "");
+                            _builder.append("Dto)");
+                            LReference _inheritedFeature_2 = ((LDtoInheritedReference)f).getInheritedFeature();
+                            String _name_3 = _inheritedFeature_2.getName();
+                            _builder.append(_name_3, "");
+                            _builder.append(");");
+                            it.append(_builder);
+                          }
+                        };
+                        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+                      }
+                    };
+                    JvmOperation _method_5 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_6.toString(), _typeRef_6, _function_6);
+                    operation = _method_5;
+                    EList<JvmMember> _members_8 = controlCls.getMembers();
+                    StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_8, operation);
+                  }
+                }
+              }
+            }
+          }
+          StringConcatenation _builder_2 = new StringConcatenation();
+          _builder_2.append("set");
+          StatemachineDTOType _attributeType_12 = it.getAttributeType();
+          LDto _attributeType_13 = _attributeType_12.getAttributeType();
+          String _name_3 = _attributeType_13.getName();
+          String _firstUpper_3 = StringExtensions.toFirstUpper(_name_3);
+          _builder_2.append(_firstUpper_3, "");
+          JvmTypeReference _typeRef_2 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = dto.getName();
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IDto.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              it.setVisibility(JvmVisibility.PUBLIC);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("pcs.firePropertyChange(\"");
+                  StatemachineDTOType _attributeType = dto.getAttributeType();
+                  LDto _attributeType_1 = _attributeType.getAttributeType();
+                  String _name = _attributeType_1.getName();
+                  String _firstLower = StringExtensions.toFirstLower(_name);
+                  _builder.append(_firstLower, "");
+                  _builder.append("\", this.");
+                  String _name_1 = dto.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append(", this.");
+                  String _name_2 = dto.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append(" = (");
+                  StatemachineDTOType _attributeType_2 = dto.getAttributeType();
+                  LDto _attributeType_3 = _attributeType_2.getAttributeType();
+                  String _name_3 = _attributeType_3.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append(")");
+                  String _name_4 = dto.getName();
+                  _builder.append(_name_4, "");
+                  _builder.append(");");
+                  {
+                    boolean _isHasEvent = dto.isHasEvent();
+                    if (_isHasEvent) {
+                      _builder.newLineIfNotEmpty();
+                      _builder.append("statemachine.processEvent(statemachine, new MessageEvent(MessageEvent.EventType.TRIGGER, \"");
+                      StatemachineEvent _event = dto.getEvent();
+                      String _name_5 = _event.getName();
+                      _builder.append(_name_5, "");
+                      _builder.append("\"));");
+                    }
+                  }
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_2.toString(), _typeRef_2, _function_2);
+          operation = _method_1;
+          operation.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmMember> _members_2 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
+          StringConcatenation _builder_3 = new StringConcatenation();
+          _builder_3.append("update");
+          StatemachineDTOType _attributeType_14 = it.getAttributeType();
+          LDto _attributeType_15 = _attributeType_14.getAttributeType();
+          String _name_4 = _attributeType_15.getName();
+          String _firstUpper_4 = StringExtensions.toFirstUpper(_name_4);
+          _builder_3.append(_firstUpper_4, "");
+          JvmTypeReference _typeRef_3 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function_3 = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              it.setVisibility(JvmVisibility.PUBLIC);
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = dto.getName();
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IDto.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("((IDTOService<");
+                  StatemachineDTOType _attributeType = dto.getAttributeType();
+                  LDto _attributeType_1 = _attributeType.getAttributeType();
+                  String _name = _attributeType_1.getName();
+                  _builder.append(_name, "");
+                  _builder.append(">)dtoServices.get(\"");
+                  StatemachineDTOType _attributeType_2 = dto.getAttributeType();
+                  LDto _attributeType_3 = _attributeType_2.getAttributeType();
+                  String _name_1 = _attributeType_3.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append("\")).update((");
+                  StatemachineDTOType _attributeType_4 = dto.getAttributeType();
+                  LDto _attributeType_5 = _attributeType_4.getAttributeType();
+                  String _name_2 = _attributeType_5.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append(")");
+                  String _name_3 = dto.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append(");");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method_2 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_3.toString(), _typeRef_3, _function_3);
+          operation = _method_2;
+          EList<JvmMember> _members_3 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, operation);
+          StringConcatenation _builder_4 = new StringConcatenation();
+          _builder_4.append("delete");
+          StatemachineDTOType _attributeType_16 = it.getAttributeType();
+          LDto _attributeType_17 = _attributeType_16.getAttributeType();
+          String _name_5 = _attributeType_17.getName();
+          String _firstUpper_5 = StringExtensions.toFirstUpper(_name_5);
+          _builder_4.append(_firstUpper_5, "");
+          JvmTypeReference _typeRef_4 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
+          final Procedure1<JvmOperation> _function_4 = new Procedure1<JvmOperation>() {
+            public void apply(final JvmOperation it) {
+              it.setVisibility(JvmVisibility.PUBLIC);
+              EList<JvmFormalParameter> _parameters = it.getParameters();
+              String _name = dto.getName();
+              JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IDto.class);
+              JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(control, _name, _typeRef);
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                public void apply(final ITreeAppendable it) {
+                  StringConcatenation _builder = new StringConcatenation();
+                  _builder.append("((IDTOService<");
+                  StatemachineDTOType _attributeType = dto.getAttributeType();
+                  LDto _attributeType_1 = _attributeType.getAttributeType();
+                  String _name = _attributeType_1.getName();
+                  _builder.append(_name, "");
+                  _builder.append(">)dtoServices.get(\"");
+                  StatemachineDTOType _attributeType_2 = dto.getAttributeType();
+                  LDto _attributeType_3 = _attributeType_2.getAttributeType();
+                  String _name_1 = _attributeType_3.getName();
+                  _builder.append(_name_1, "");
+                  _builder.append("\")).delete((");
+                  StatemachineDTOType _attributeType_4 = dto.getAttributeType();
+                  LDto _attributeType_5 = _attributeType_4.getAttributeType();
+                  String _name_2 = _attributeType_5.getName();
+                  _builder.append(_name_2, "");
+                  _builder.append(")");
+                  String _name_3 = dto.getName();
+                  _builder.append(_name_3, "");
+                  _builder.append(");");
+                  it.append(_builder);
+                }
+              };
+              StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+            }
+          };
+          JvmOperation _method_3 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(control, _builder_4.toString(), _typeRef_4, _function_4);
+          operation = _method_3;
+          EList<JvmMember> _members_4 = controlCls.getMembers();
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
+        }
+      };
+      _dtos_1.forEach(_function_1);
+      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(Void.TYPE);
+      final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+        public void apply(final JvmOperation it) {
+          EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+          JvmAnnotationReference _annotationRef = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(Override.class);
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
+          it.setVisibility(JvmVisibility.PUBLIC);
+          final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+            public void apply(final ITreeAppendable it) {
+              StringConcatenation _builder = new StringConcatenation();
+              _builder.append("if (dtoServices.isEmpty()) {");
+              _builder.newLine();
+              {
+                EList<StatemachineControlDTOAttribute> _dtos = control.getDtos();
+                for(final StatemachineControlDTOAttribute dto : _dtos) {
+                  _builder.append("\t");
+                  _builder.append("initDatasource(\"");
+                  String _name = dto.getName();
+                  _builder.append(_name, "\t");
+                  _builder.append("\");");
+                  _builder.newLineIfNotEmpty();
+                }
+              }
+              _builder.append("}");
+              _builder.newLine();
+              it.append(_builder);
+            }
+          };
+          StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+        }
+      };
+      JvmOperation init = this._jvmTypesBuilder.toMethod(control, "init", _typeRef, _function_2);
+      EList<JvmMember> _members = controlCls.getMembers();
+      _xblockexpression = this._jvmTypesBuilder.<JvmOperation>operator_add(_members, init);
+    }
+    return _xblockexpression;
+  }
+  
+  public boolean containsType(final EList<StatemachineControlDTOAttribute> list, final String entityName) {
+    for (final StatemachineControlDTOAttribute attr : list) {
+      StatemachineDTOType _attributeType = attr.getAttributeType();
+      LDto _attributeType_1 = _attributeType.getAttributeType();
+      LType _wrappedType = _attributeType_1.getWrappedType();
+      String _name = null;
+      if (_wrappedType!=null) {
+        _name=_wrappedType.getName();
+      }
+      boolean _equals = entityName.equals(_name);
+      if (_equals) {
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  public String decodeSetter(final StatemachineControlFieldAttribute field) {
+    StatemachineFieldType _attributeType = field.getAttributeType();
+    StatemachineInternalType _attributeType_1 = _attributeType.getAttributeType();
+    if (_attributeType_1 != null) {
+      switch (_attributeType_1) {
+        case BOOLEAN:
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("pcs.firePropertyChange(\"");
+          String _name = field.getName();
+          _builder.append(_name, "");
+          _builder.append("\", this.");
+          String _name_1 = field.getName();
+          _builder.append(_name_1, "");
+          _builder.append(", this.");
+          String _name_2 = field.getName();
+          _builder.append(_name_2, "");
+          _builder.append(" = ");
+          String _name_3 = field.getName();
+          _builder.append(_name_3, "");
+          _builder.append(");");
+          _builder.newLineIfNotEmpty();
+          return _builder.toString();
+        case INTEGER:
+          StringConcatenation _builder_1 = new StringConcatenation();
+          _builder_1.append("pcs.firePropertyChange(\"");
+          String _name_4 = field.getName();
+          _builder_1.append(_name_4, "");
+          _builder_1.append("\", this.");
+          String _name_5 = field.getName();
+          _builder_1.append(_name_5, "");
+          _builder_1.append(", this.");
+          String _name_6 = field.getName();
+          _builder_1.append(_name_6, "");
+          _builder_1.append(" = ");
+          String _name_7 = field.getName();
+          _builder_1.append(_name_7, "");
+          _builder_1.append(");");
+          _builder_1.newLineIfNotEmpty();
+          return _builder_1.toString();
+        case LONG:
+          StringConcatenation _builder_2 = new StringConcatenation();
+          _builder_2.append("pcs.firePropertyChange(\"");
+          String _name_8 = field.getName();
+          _builder_2.append(_name_8, "");
+          _builder_2.append("\", this.");
+          String _name_9 = field.getName();
+          _builder_2.append(_name_9, "");
+          _builder_2.append(", this.");
+          String _name_10 = field.getName();
+          _builder_2.append(_name_10, "");
+          _builder_2.append(" = ");
+          String _name_11 = field.getName();
+          _builder_2.append(_name_11, "");
+          _builder_2.append(");");
+          _builder_2.newLineIfNotEmpty();
+          return _builder_2.toString();
+        case DOUBLE:
+          StringConcatenation _builder_3 = new StringConcatenation();
+          _builder_3.append("pcs.firePropertyChange(\"");
+          String _name_12 = field.getName();
+          _builder_3.append(_name_12, "");
+          _builder_3.append("\", this.");
+          String _name_13 = field.getName();
+          _builder_3.append(_name_13, "");
+          _builder_3.append(", this.");
+          String _name_14 = field.getName();
+          _builder_3.append(_name_14, "");
+          _builder_3.append(" = ");
+          String _name_15 = field.getName();
+          _builder_3.append(_name_15, "");
+          _builder_3.append(");");
+          _builder_3.newLineIfNotEmpty();
+          return _builder_3.toString();
+        case STRING:
+          StringConcatenation _builder_4 = new StringConcatenation();
+          _builder_4.append("pcs.firePropertyChange(\"");
+          String _name_16 = field.getName();
+          _builder_4.append(_name_16, "");
+          _builder_4.append("\", this.");
+          String _name_17 = field.getName();
+          _builder_4.append(_name_17, "");
+          _builder_4.append(", this.");
+          String _name_18 = field.getName();
+          _builder_4.append(_name_18, "");
+          _builder_4.append(" = ");
+          String _name_19 = field.getName();
+          _builder_4.append(_name_19, "");
+          _builder_4.append(");");
+          _builder_4.newLineIfNotEmpty();
+          return _builder_4.toString();
+        case DATE:
+          StringConcatenation _builder_5 = new StringConcatenation();
+          _builder_5.append("pcs.firePropertyChange(\"");
+          String _name_20 = field.getName();
+          _builder_5.append(_name_20, "");
+          _builder_5.append("\", this.");
+          String _name_21 = field.getName();
+          _builder_5.append(_name_21, "");
+          _builder_5.append(", this.");
+          String _name_22 = field.getName();
+          _builder_5.append(_name_22, "");
+          _builder_5.append(" = ");
+          String _name_23 = field.getName();
+          _builder_5.append(_name_23, "");
+          _builder_5.append(");");
+          _builder_5.newLineIfNotEmpty();
+          return _builder_5.toString();
+        case SUGGESTTEXT:
+          StringConcatenation _builder_6 = new StringConcatenation();
+          _builder_6.append("pcs.firePropertyChange(\"");
+          String _name_24 = field.getName();
+          _builder_6.append(_name_24, "");
+          _builder_6.append("\", this.");
+          String _name_25 = field.getName();
+          _builder_6.append(_name_25, "");
+          _builder_6.append(", this.");
+          String _name_26 = field.getName();
+          _builder_6.append(_name_26, "");
+          _builder_6.append(" = ");
+          String _name_27 = field.getName();
+          _builder_6.append(_name_27, "");
+          _builder_6.append(");");
+          _builder_6.newLineIfNotEmpty();
+          _builder_6.append("set");
+          String _name_28 = field.getName();
+          String _firstUpper = StringExtensions.toFirstUpper(_name_28);
+          _builder_6.append(_firstUpper, "");
+          _builder_6.append("Event(null);");
+          _builder_6.newLineIfNotEmpty();
+          _builder_6.append("if(");
+          String _name_29 = field.getName();
+          _builder_6.append(_name_29, "");
+          _builder_6.append(" == null || ");
+          String _name_30 = field.getName();
+          _builder_6.append(_name_30, "");
+          _builder_6.append(".isEmpty()) {");
+          _builder_6.newLineIfNotEmpty();
+          _builder_6.append("\t");
+          _builder_6.append("set");
+          String _name_31 = field.getName();
+          String _firstUpper_1 = StringExtensions.toFirstUpper(_name_31);
+          _builder_6.append(_firstUpper_1, "\t");
+          _builder_6.append("Event(YSuggestTextFieldEvents.CLEAR);");
+          _builder_6.newLineIfNotEmpty();
+          _builder_6.append("} else {");
+          _builder_6.newLine();
+          _builder_6.append("\t");
+          _builder_6.append("set");
+          String _name_32 = field.getName();
+          String _firstUpper_2 = StringExtensions.toFirstUpper(_name_32);
+          _builder_6.append(_firstUpper_2, "\t");
+          _builder_6.append("Event(YSuggestTextFieldEvents.OPEN_POPUP);");
+          _builder_6.newLineIfNotEmpty();
+          _builder_6.append("}");
+          return _builder_6.toString();
+        default:
+          break;
+      }
+    }
+    return null;
+  }
+  
+  public Class<?> decodeType(final StatemachineControlFieldAttribute field) {
+    StatemachineFieldType _attributeType = field.getAttributeType();
+    StatemachineInternalType _attributeType_1 = _attributeType.getAttributeType();
+    if (_attributeType_1 != null) {
+      switch (_attributeType_1) {
+        case BOOLEAN:
+          return Boolean.class;
+        case INTEGER:
+          return Integer.class;
+        case LONG:
+          return Long.class;
+        case DOUBLE:
+          return Double.class;
+        case STRING:
+          return String.class;
+        case DATE:
+          return Date.class;
+        case SUGGESTTEXT:
+          return String.class;
+        default:
+          break;
+      }
+    }
+    return null;
+  }
+  
+  public void toConstructor(final JvmDeclaredType type, final Statemachine statemachine) {
+    EList<JvmMember> _members = type.getMembers();
+    final Procedure1<JvmConstructor> _function = new Procedure1<JvmConstructor>() {
+      public void apply(final JvmConstructor it) {
+        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+          public void apply(final ITreeAppendable it) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("super();");
+            _builder.newLine();
+            _builder.append("state = States.");
+            StatemachineState _initialState = statemachine.getInitialState();
+            String _name = _initialState.getName();
+            _builder.append(_name, "");
+            _builder.append(";");
+            it.append(_builder);
+          }
+        };
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+      }
+    };
+    JvmConstructor _constructor = this._jvmTypesBuilder.toConstructor(statemachine, _function);
+    this._jvmTypesBuilder.<JvmConstructor>operator_add(_members, _constructor);
+  }
+  
+  public void toFields(final JvmGenericType type, final Statemachine statemachine) {
+    JvmField field = null;
+    JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(Logger.class);
+    final Procedure1<JvmField> _function = new Procedure1<JvmField>() {
+      public void apply(final JvmField it) {
+        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+          public void apply(final ITreeAppendable it) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("org.slf4j.LoggerFactory.getLogger(\"statemachine\")");
+            it.append(_builder);
+          }
+        };
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
+      }
+    };
+    JvmField _field = this._jvmTypesBuilder.toField(statemachine, "log", _typeRef, _function);
+    field = _field;
+    field.setStatic(true);
+    field.setVisibility(JvmVisibility.PRIVATE);
+    EList<JvmMember> _members = type.getMembers();
+    this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+    JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef("States");
+    JvmField _field_1 = this._jvmTypesBuilder.toField(statemachine, "state", _typeRef_1);
+    field = _field_1;
+    field.setVisibility(JvmVisibility.PRIVATE);
+    EList<JvmMember> _members_1 = type.getMembers();
+    this._jvmTypesBuilder.<JvmField>operator_add(_members_1, field);
+  }
+  
+  public void toOperations(final JvmGenericType type, final Statemachine statemachine) {
+    EList<JvmMember> _members = type.getMembers();
+    JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(Void.TYPE);
+    final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
+      public void apply(final JvmOperation it) {
+        EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+        JvmAnnotationReference _annotationRef = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(Override.class);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
+        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+          public void apply(final ITreeAppendable it) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("schedule(this, 100, new MessageEvent(EventType.TRIGGER, \"");
+            StatemachineEvent _initialEvent = statemachine.getInitialEvent();
+            String _name = _initialEvent.getName();
+            _builder.append(_name, "");
+            _builder.append("\"));");
+            it.append(_builder);
+          }
+        };
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+      }
+    };
+    JvmOperation _method = this._jvmTypesBuilder.toMethod(statemachine, "start", _typeRef, _function);
+    this._jvmTypesBuilder.<JvmOperation>operator_add(_members, _method);
+    EList<JvmMember> _members_1 = type.getMembers();
+    final Procedure1<JvmGenericType> _function_1 = new Procedure1<JvmGenericType>() {
+      public void apply(final JvmGenericType it) {
+        EList<JvmMember> _members = it.getMembers();
+        JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef("States");
+        final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
+          public void apply(final JvmOperation it) {
+            EList<JvmFormalParameter> _parameters = it.getParameters();
+            JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IStateMachine.class);
+            JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(statemachine, "stateMachine", _typeRef);
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+            EList<JvmFormalParameter> _parameters_1 = it.getParameters();
+            JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(MessageEvent.class);
+            JvmFormalParameter _parameter_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(statemachine, "event", _typeRef_1);
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
+          }
+        };
+        JvmOperation _method = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(statemachine, "process", _typeRef, _function);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members, _method);
+      }
+    };
+    JvmGenericType _interface = this._jvmTypesBuilder.toInterface(statemachine, "State", _function_1);
+    this._jvmTypesBuilder.<JvmGenericType>operator_add(_members_1, _interface);
+    EList<JvmMember> _members_2 = type.getMembers();
+    JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(Void.TYPE);
+    final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+      public void apply(final JvmOperation it) {
+        EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+        JvmAnnotationReference _annotationRef = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(Override.class);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
+        EList<JvmFormalParameter> _parameters = it.getParameters();
+        JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IStateMachine.class);
+        JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(statemachine, "stateMachine", _typeRef);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+        EList<JvmFormalParameter> _parameters_1 = it.getParameters();
+        JvmTypeReference _typeRef_1 = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(MessageEvent.class);
+        JvmFormalParameter _parameter_1 = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(statemachine, "event", _typeRef_1);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
+        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+          public void apply(final ITreeAppendable it) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("state = state.process(stateMachine, event);");
+            it.append(_builder);
+          }
+        };
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+      }
+    };
+    JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(statemachine, "processEvent", _typeRef_1, _function_2);
+    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method_1);
+    EList<JvmMember> _members_3 = type.getMembers();
+    final Procedure1<JvmEnumerationType> _function_3 = new Procedure1<JvmEnumerationType>() {
+      public void apply(final JvmEnumerationType it) {
+        EList<JvmTypeReference> _superTypes = it.getSuperTypes();
+        JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef("State");
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
+        EList<StatemachineState> _states = statemachine.getStates();
+        final Consumer<StatemachineState> _function = new Consumer<StatemachineState>() {
+          public void accept(final StatemachineState state) {
+            String _documentation = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(state);
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
+            EList<JvmMember> _members = it.getMembers();
+            String _name = state.getName();
+            final Procedure1<JvmEnumerationLiteral> _function = new Procedure1<JvmEnumerationLiteral>() {
+              public void apply(final JvmEnumerationLiteral it) {
+                final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+                  public void apply(final ITreeAppendable it) {
+                    StringConcatenation _builder = new StringConcatenation();
+                    _builder.append("@Override");
+                    _builder.newLine();
+                    _builder.append("public States process(final IStateMachine stateMachine, final MessageEvent event) {");
+                    _builder.newLine();
+                    _builder.append("\t");
+                    _builder.append("stateMachine.dispatchMessages(event);");
+                    _builder.newLine();
+                    _builder.append("\t");
+                    _builder.append("switch (event.getType()) {");
+                    _builder.newLine();
+                    {
+                      StatemachineControlFieldAttribute _keystroke = state.getKeystroke();
+                      boolean _notEquals = (!Objects.equal(_keystroke, null));
+                      if (_notEquals) {
+                        _builder.append("\t\tcase KEYBOARD:");
+                        _builder.newLineIfNotEmpty();
+                        _builder.append("\t\t\t");
+                        _builder.append("stateMachine.append(\"");
+                        StatemachineControlFieldAttribute _keystroke_1 = state.getKeystroke();
+                        String _name = _keystroke_1.getName();
+                        _builder.append(_name, "\t\t\t");
+                        _builder.append("\", event.getId());");
+                        {
+                          boolean _isHasKeyOperation = state.isHasKeyOperation();
+                          if (_isHasKeyOperation) {
+                            _builder.newLineIfNotEmpty();
+                            _builder.append("\t\t\t");
+                            StatemachineOperation _keyOperation = state.getKeyOperation();
+                            String _decodeOperation = StatemachineDSLJvmModelInferrer.this.decodeOperation(_keyOperation, 0);
+                            _builder.append(_decodeOperation, "\t\t\t");
+                            _builder.newLineIfNotEmpty();
+                          }
+                        }
+                        _builder.append("\t\t\t");
+                        _builder.append("break;");
+                        _builder.newLine();
+                      }
+                    }
+                    {
+                      StatemachineOperation _identity = state.getIdentity();
+                      boolean _notEquals_1 = (!Objects.equal(_identity, null));
+                      if (_notEquals_1) {
+                        _builder.append("\t\tcase ID:");
+                        _builder.newLineIfNotEmpty();
+                        _builder.append("\t\t\t");
+                        StatemachineOperation _identity_1 = state.getIdentity();
+                        String _decodeOperation_1 = StatemachineDSLJvmModelInferrer.this.decodeOperation(_identity_1, true, 0);
+                        _builder.append(_decodeOperation_1, "\t\t\t");
+                        _builder.newLineIfNotEmpty();
+                        _builder.append("\t\t\t");
+                        _builder.append("break;");
+                        _builder.newLine();
+                      }
+                    }
+                    {
+                      EList<StatemachineTrigger> _triggers = state.getTriggers();
+                      int _size = _triggers.size();
+                      boolean _greaterThan = (_size > 0);
+                      if (_greaterThan) {
+                        _builder.append("\t\tcase TRIGGER:");
+                        _builder.newLineIfNotEmpty();
+                        _builder.append("\t\t\t");
+                        CharSequence _createTriggerEvents = StatemachineDSLJvmModelInferrer.this.createTriggerEvents(state);
+                        _builder.append(_createTriggerEvents, "\t\t\t");
+                        _builder.newLineIfNotEmpty();
+                      }
+                    }
+                    _builder.append("\t\t");
+                    _builder.append("default:");
+                    _builder.newLine();
+                    _builder.append("\t\t\t");
+                    _builder.append("break;");
+                    _builder.newLine();
+                    _builder.append("\t");
+                    _builder.append("}");
+                    _builder.newLine();
+                    _builder.append("\t");
+                    _builder.append("return this;");
+                    _builder.newLine();
+                    _builder.append("}");
+                    it.append(_builder);
+                  }
+                };
+                StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
+              }
+            };
+            JvmEnumerationLiteral _enumerationLiteral = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toEnumerationLiteral(state, _name, _function);
+            StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmEnumerationLiteral>operator_add(_members, _enumerationLiteral);
+          }
+        };
+        _states.forEach(_function);
+      }
+    };
+    JvmEnumerationType _enumerationType = this._jvmTypesBuilder.toEnumerationType(statemachine, "States", _function_3);
+    this._jvmTypesBuilder.<JvmEnumerationType>operator_add(_members_3, _enumerationType);
+  }
+  
+  public String className(final Statemachine statemachine) {
+    String _name = statemachine.getName();
+    String _string = _name.toString();
+    String clsName = StringExtensions.toFirstUpper(_string);
+    String _quote = Pattern.quote(".");
+    String[] parts = clsName.split(_quote);
+    int len = parts.length;
+    if ((len > 1)) {
+      String _get = parts[(len - 1)];
+      return StringExtensions.toFirstUpper(_get);
+    }
+    return clsName;
+  }
+  
+  public CharSequence createTriggerEvents(final StatemachineState state) {
+    StringConcatenation _builder = new StringConcatenation();
+    _builder.append("switch (event.getId()) {");
+    _builder.newLine();
+    {
+      EList<StatemachineTrigger> _triggers = state.getTriggers();
+      for(final StatemachineTrigger trig : _triggers) {
+        {
+          EList<StatemachineEvent> _triggers_1 = trig.getTriggers();
+          for(final StatemachineEvent t : _triggers_1) {
+            _builder.append("\tcase \"");
+            String _name = t.getName();
+            _builder.append(_name, "");
+            _builder.append("\":");
+            _builder.newLineIfNotEmpty();
+          }
+        }
+        String _doGuards = this.doGuards(trig, 2);
+        _builder.append(_doGuards, "");
+        _builder.newLineIfNotEmpty();
+      }
+    }
+    String _identation = this.identation(1);
+    _builder.append(_identation, "");
+    _builder.append("}");
+    _builder.newLineIfNotEmpty();
+    String _identation_1 = this.identation(1);
+    _builder.append(_identation_1, "");
+    _builder.append("break;");
+    _builder.newLineIfNotEmpty();
+    return _builder;
+  }
+  
+  public String doGuards(final StatemachineTrigger trigger, final int level) {
+    StringConcatenation _builder = new StringConcatenation();
+    EList<StatemachineGuard> _guards = trigger.getGuards();
+    Iterator<StatemachineGuard> _iterator = _guards.iterator();
+    String _recurseGuards = this.recurseGuards(trigger, _iterator, level);
+    _builder.append(_recurseGuards, "");
+    {
+      boolean _or = false;
+      boolean _and = false;
+      EList<StatemachineGuard> _guards_1 = trigger.getGuards();
+      int _size = _guards_1.size();
+      boolean _equals = (_size == 0);
+      if (!_equals) {
+        _and = false;
+      } else {
+        boolean _isHasTransition = trigger.isHasTransition();
+        boolean _not = (!_isHasTransition);
+        _and = _not;
+      }
+      if (_and) {
+        _or = true;
+      } else {
+        EList<StatemachineGuard> _guards_2 = trigger.getGuards();
+        int _size_1 = _guards_2.size();
+        boolean _greaterThan = (_size_1 > 0);
+        _or = _greaterThan;
+      }
+      if (_or) {
+        _builder.newLineIfNotEmpty();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("break;");
+      }
+    }
+    return _builder.toString();
+  }
+  
+  public String recurseGuards(final StatemachineTrigger trigger, final Iterator<StatemachineGuard> guards, final int level) {
+    String body = "";
+    boolean _hasNext = guards.hasNext();
+    if (_hasNext) {
+      StatemachineGuard guard = guards.next();
+      StringConcatenation _builder = new StringConcatenation();
+      CharSequence _decodeGuard = this.decodeGuard(guard, level);
+      _builder.append(_decodeGuard, "");
+      _builder.newLineIfNotEmpty();
+      String _recurseGuards = this.recurseGuards(trigger, guards, (level + 1));
+      _builder.append(_recurseGuards, "");
+      _builder.newLineIfNotEmpty();
+      String _identation = this.identation(level);
+      _builder.append(_identation, "");
+      _builder.append("}");
+      _builder.newLineIfNotEmpty();
+      CharSequence _decodeGuardOnFail = this.decodeGuardOnFail(guard, level);
+      _builder.append(_decodeGuardOnFail, "");
+      _builder.newLineIfNotEmpty();
+      body = _builder.toString();
+    } else {
+      StringConcatenation _builder_1 = new StringConcatenation();
+      CharSequence _generateActions = this.generateActions(trigger, level);
+      _builder_1.append(_generateActions, "");
+      _builder_1.newLineIfNotEmpty();
+      {
+        boolean _isHasTransition = trigger.isHasTransition();
+        if (_isHasTransition) {
+          String _identation_1 = this.identation(level);
+          _builder_1.append(_identation_1, "");
+          _builder_1.append("return ");
+          StatemachineState _transition = trigger.getTransition();
+          String _name = _transition.getName();
+          _builder_1.append(_name, "");
+          _builder_1.append(";");
+          _builder_1.newLineIfNotEmpty();
+        }
+      }
+      body = _builder_1.toString();
+    }
+    return body;
+  }
+  
+  public String identation(final int level) {
+    StringConcatenation _builder = new StringConcatenation();
+    String body = _builder.toString();
+    for (int i = 0; (i < level); i++) {
+      StringConcatenation _builder_1 = new StringConcatenation();
+      _builder_1.append(body, "");
+      _builder_1.append("\t");
+      body = _builder_1.toString();
+    }
+    return body;
+  }
+  
+  public CharSequence decodeGuard(final StatemachineGuard guard, final int level) {
+    StringConcatenation _builder = new StringConcatenation();
+    String _identation = this.identation(level);
+    _builder.append(_identation, "");
+    _builder.append("if((boolean)");
+    FunctionLibraryGuard _guard = guard.getGuard();
+    String _name = _guard.getName();
+    String _call = this.call(((EObject) guard), _name, StatemachineEnums.Functions.GUARD, null, null, false);
+    _builder.append(_call, "");
+    _builder.append(") {");
+    return _builder;
+  }
+  
+  public CharSequence decodeGuardOnFail(final StatemachineGuard guard, final int level) {
+    StringConcatenation _builder = new StringConcatenation();
+    {
+      boolean _isHasOnFail = guard.isHasOnFail();
+      if (_isHasOnFail) {
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("else {");
+        _builder.newLineIfNotEmpty();
+        _builder.append("\t");
+        String _identation_1 = this.identation(level);
+        _builder.append(_identation_1, "\t");
+        _builder.append("Notification.show(stateMachine.getTranslation(\"");
+        String _onFailCaption = guard.getOnFailCaption();
+        _builder.append(_onFailCaption, "\t");
+        _builder.append("\"), stateMachine.getTranslation(\"");
+        String _onFailDescription = guard.getOnFailDescription();
+        _builder.append(_onFailDescription, "\t");
+        _builder.append("\"), Type.");
+        StatemachineUserMessageType _onFailType = guard.getOnFailType();
+        String _name = _onFailType.getName();
+        _builder.append(_name, "\t");
+        _builder.append(");");
+        _builder.newLineIfNotEmpty();
+        String _identation_2 = this.identation(level);
+        _builder.append(_identation_2, "");
+        _builder.append("}");
+      }
+    }
+    return _builder;
+  }
+  
+  public CharSequence generateActions(final StatemachineTrigger trigger, final int level) {
+    StringConcatenation _builder = new StringConcatenation();
+    {
+      EList<StatemachineAction> _actions = trigger.getActions();
+      for(final StatemachineAction action : _actions) {
+        String _switchAction = this.switchAction(action, level);
+        _builder.append(_switchAction, "");
+        _builder.newLineIfNotEmpty();
+      }
+    }
+    return _builder;
+  }
+  
+  public String switchAction(final StatemachineAction action, final int level) {
+    boolean _matched = false;
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralBlinkRate) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"blinkRate\", ");
+        int _blinkRate = ((StatemachineActionPeripheralBlinkRate)action).getBlinkRate();
+        _builder.append(_blinkRate, "");
+        _builder.append(");");
+        _builder.newLineIfNotEmpty();
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralClear) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"clearDisplay\", \"\");");
+        _builder.newLineIfNotEmpty();
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralCreateWindow) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"createWindow\", \"");
+        int _viewportRow = ((StatemachineActionPeripheralCreateWindow)action).getViewportRow();
+        _builder.append(_viewportRow, "");
+        _builder.append("|");
+        int _viewportColumn = ((StatemachineActionPeripheralCreateWindow)action).getViewportColumn();
+        _builder.append(_viewportColumn, "");
+        _builder.append("|");
+        int _viewportHeight = ((StatemachineActionPeripheralCreateWindow)action).getViewportHeight();
+        _builder.append(_viewportHeight, "");
+        _builder.append("|");
+        int _viewportWidth = ((StatemachineActionPeripheralCreateWindow)action).getViewportWidth();
+        _builder.append(_viewportWidth, "");
+        _builder.append("|");
+        int _windowHeight = ((StatemachineActionPeripheralCreateWindow)action).getWindowHeight();
+        _builder.append(_windowHeight, "");
+        _builder.append("|");
+        int _windowWidth = ((StatemachineActionPeripheralCreateWindow)action).getWindowWidth();
+        _builder.append(_windowWidth, "");
+        _builder.append("\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralCursorType) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"cursorType\", LineDisplayConst.");
+        StatemachineLineDisplayCursorType _cursorType = ((StatemachineActionPeripheralCursorType)action).getCursorType();
+        String _name = _cursorType.getName();
+        _builder.append(_name, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralDestroyWindow) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"destroyWindow\", \"\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralDeviceBrightness) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"deviceBrightness\", ");
+        int _brightness = ((StatemachineActionPeripheralDeviceBrightness)action).getBrightness();
+        _builder.append(_brightness, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralDisplayBitmap) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"displayBitmap\", ");
+        int _bitmapId = ((StatemachineActionPeripheralDisplayBitmap)action).getBitmapId();
+        _builder.append(_bitmapId, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralDisplayText) {
+        _matched=true;
+        boolean _isHasType = ((StatemachineActionPeripheralDisplayText)action).isHasType();
+        if (_isHasType) {
+          StringConcatenation _builder = new StringConcatenation();
+          String _identation = this.identation(level);
+          _builder.append(_identation, "");
+          _builder.append("stateMachine.set(\"displayLine\", ");
+          StatemachineActionFieldConcatenation _text = ((StatemachineActionPeripheralDisplayText)action).getText();
+          JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(String.class);
+          CharSequence _concatenation = this.concatenation(_text, _typeRef);
+          _builder.append(_concatenation, "");
+          _builder.append("+\"|\"+LineDisplayConst.");
+          StatemachineLineDisplayTextType _textType = ((StatemachineActionPeripheralDisplayText)action).getTextType();
+          String _name = _textType.getName();
+          _builder.append(_name, "");
+          _builder.append(");");
+          return _builder.toString();
+        } else {
+          StringConcatenation _builder_1 = new StringConcatenation();
+          String _identation_1 = this.identation(level);
+          _builder_1.append(_identation_1, "");
+          _builder_1.append("stateMachine.set(\"displayLine\", ");
+          StatemachineActionFieldConcatenation _text_1 = ((StatemachineActionPeripheralDisplayText)action).getText();
+          JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(String.class);
+          CharSequence _concatenation_1 = this.concatenation(_text_1, _typeRef_1);
+          _builder_1.append(_concatenation_1, "");
+          _builder_1.append(");");
+          return _builder_1.toString();
+        }
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralDisplayTextAt) {
+        _matched=true;
+        boolean _isHasType = ((StatemachineActionPeripheralDisplayTextAt)action).isHasType();
+        if (_isHasType) {
+          StringConcatenation _builder = new StringConcatenation();
+          String _identation = this.identation(level);
+          _builder.append(_identation, "");
+          _builder.append("stateMachine.set(\"displayTextAt\", \"");
+          int _row = ((StatemachineActionPeripheralDisplayTextAt)action).getRow();
+          _builder.append(_row, "");
+          _builder.append("|");
+          int _column = ((StatemachineActionPeripheralDisplayTextAt)action).getColumn();
+          _builder.append(_column, "");
+          _builder.append("|\"+");
+          StatemachineActionFieldConcatenation _text = ((StatemachineActionPeripheralDisplayTextAt)action).getText();
+          JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(String.class);
+          CharSequence _concatenation = this.concatenation(_text, _typeRef);
+          _builder.append(_concatenation, "");
+          _builder.append("+\"|\"+LineDisplayConst.");
+          StatemachineLineDisplayTextType _textType = ((StatemachineActionPeripheralDisplayTextAt)action).getTextType();
+          String _name = _textType.getName();
+          _builder.append(_name, "");
+          _builder.append(");");
+          return _builder.toString();
+        } else {
+          StringConcatenation _builder_1 = new StringConcatenation();
+          String _identation_1 = this.identation(level);
+          _builder_1.append(_identation_1, "");
+          _builder_1.append("stateMachine.set(\"displayTextAt\", \"");
+          int _row_1 = ((StatemachineActionPeripheralDisplayTextAt)action).getRow();
+          _builder_1.append(_row_1, "");
+          _builder_1.append("|");
+          int _column_1 = ((StatemachineActionPeripheralDisplayTextAt)action).getColumn();
+          _builder_1.append(_column_1, "");
+          _builder_1.append("|\"+");
+          StatemachineActionFieldConcatenation _text_1 = ((StatemachineActionPeripheralDisplayTextAt)action).getText();
+          JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(String.class);
+          CharSequence _concatenation_1 = this.concatenation(_text_1, _typeRef_1);
+          _builder_1.append(_concatenation_1, "");
+          _builder_1.append(");");
+          return _builder_1.toString();
+        }
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralInterCharacterWait) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"interCharacterWait\", ");
+        int _wait = ((StatemachineActionPeripheralInterCharacterWait)action).getWait();
+        _builder.append(_wait, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralMarqueeFormat) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"marqueeFormat\", LineDisplayConst.");
+        StatemachineLineDisplayMarqueeFormat _format = ((StatemachineActionPeripheralMarqueeFormat)action).getFormat();
+        String _name = _format.getName();
+        _builder.append(_name, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralMarqueeRepeatWait) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"marqueeRepeatWait\", ");
+        int _wait = ((StatemachineActionPeripheralMarqueeRepeatWait)action).getWait();
+        _builder.append(_wait, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralMarqueeType) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"marqueeType\", LineDisplayConst.");
+        StatemachineLineDisplayMarqueeType _marqueeType = ((StatemachineActionPeripheralMarqueeType)action).getMarqueeType();
+        String _name = _marqueeType.getName();
+        _builder.append(_name, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralMarqueeUnitWait) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"marqueeUnitWait\", ");
+        int _wait = ((StatemachineActionPeripheralMarqueeUnitWait)action).getWait();
+        _builder.append(_wait, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralScroll) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"scroll\", \"\"+LineDisplayConst.");
+        StatemachineLineDisplayScrollTextType _direction = ((StatemachineActionPeripheralScroll)action).getDirection();
+        String _name = _direction.getName();
+        _builder.append(_name, "");
+        _builder.append("+\"|");
+        int _units = ((StatemachineActionPeripheralScroll)action).getUnits();
+        _builder.append(_units, "");
+        _builder.append("\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralOpenDrawer) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"openDrawer\", 0);");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPrintBarcode) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"printBarcode\", \"");
+        String _data = ((StatemachineActionPeripheralPrintBarcode)action).getData();
+        _builder.append(_data, "");
+        _builder.append("|\"+POSPrinterConst.");
+        StatemachinePOSPrinterBarcodeType _barcodeType = ((StatemachineActionPeripheralPrintBarcode)action).getBarcodeType();
+        String _name = _barcodeType.getName();
+        _builder.append(_name, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPrintBitmap) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"printBitmap\", ");
+        int _bitmapId = ((StatemachineActionPeripheralPrintBitmap)action).getBitmapId();
+        _builder.append(_bitmapId, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPrintCut) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"printCut\",");
+        StatemachineActionFieldConcatenation _text = ((StatemachineActionPeripheralPrintCut)action).getText();
+        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(String.class);
+        CharSequence _concatenation = this.concatenation(_text, _typeRef);
+        _builder.append(_concatenation, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPrintNormal) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"printNormal\", ");
+        StatemachineActionFieldConcatenation _text = ((StatemachineActionPeripheralPrintNormal)action).getText();
+        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(String.class);
+        CharSequence _concatenation = this.concatenation(_text, _typeRef);
+        _builder.append(_concatenation, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPrintRegisterBitmap) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"registerBitmap\", \"");
+        int _bitmapId = ((StatemachineActionPeripheralPrintRegisterBitmap)action).getBitmapId();
+        _builder.append(_bitmapId, "");
+        _builder.append("|icons/");
+        String _name = ((StatemachineActionPeripheralPrintRegisterBitmap)action).getName();
+        _builder.append(_name, "");
+        _builder.append(".bmp\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPTOpen) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"paymentTerminalOpen\", ");
+        StatemachineActionFieldConcatenation _host = ((StatemachineActionPeripheralPTOpen)action).getHost();
+        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(String.class);
+        CharSequence _concatenation = this.concatenation(_host, _typeRef);
+        _builder.append(_concatenation, "");
+        _builder.append("+\"|\"+");
+        StatemachineActionFieldConcatenation _port = ((StatemachineActionPeripheralPTOpen)action).getPort();
+        JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(int.class);
+        CharSequence _concatenation_1 = this.concatenation(_port, _typeRef_1);
+        _builder.append(_concatenation_1, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPTClose) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"paymentTerminalClose\", \"\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPTAcknowledge) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"paymentTerminalAcknowledge\", \"\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPTReversal) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"paymentTerminalReversal\", ");
+        StatemachineActionFieldConcatenation _password = ((StatemachineActionPeripheralPTReversal)action).getPassword();
+        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(String.class);
+        CharSequence _concatenation = this.concatenation(_password, _typeRef);
+        _builder.append(_concatenation, "");
+        _builder.append("+\"|\"+");
+        StatemachineActionFieldConcatenation _receipt = ((StatemachineActionPeripheralPTReversal)action).getReceipt();
+        JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(String.class);
+        CharSequence _concatenation_1 = this.concatenation(_receipt, _typeRef_1);
+        _builder.append(_concatenation_1, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPTRegistration) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"paymentTerminalRegistration\", ");
+        StatemachineActionFieldConcatenation _password = ((StatemachineActionPeripheralPTRegistration)action).getPassword();
+        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(String.class);
+        CharSequence _concatenation = this.concatenation(_password, _typeRef);
+        _builder.append(_concatenation, "");
+        _builder.append("+\"|");
+        String _configuration = ((StatemachineActionPeripheralPTRegistration)action).getConfiguration();
+        _builder.append(_configuration, "");
+        _builder.append("\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPTAuthorization) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"paymentTerminalAuthorization\", ");
+        StatemachineActionFieldConcatenation _amount = ((StatemachineActionPeripheralPTAuthorization)action).getAmount();
+        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(Double.class);
+        CharSequence _concatenation = this.concatenation(_amount, _typeRef);
+        _builder.append(_concatenation, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPrintReport) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"printReport\", \"");
+        Report _report = ((StatemachineActionPeripheralPrintReport)action).getReport();
+        QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(_report);
+        _builder.append(_fullyQualifiedName, "");
+        {
+          boolean _isHasFilter = ((StatemachineActionPeripheralPrintReport)action).isHasFilter();
+          if (_isHasFilter) {
+            _builder.append("|");
+            StatemachineStorage _key = ((StatemachineActionPeripheralPrintReport)action).getKey();
+            _builder.append(_key, "");
+          }
+        }
+        _builder.append("\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldSet) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"");
+        StatemachineControlFieldAttribute _attribute = ((StatemachineActionFieldSet)action).getAttribute();
+        String _name = _attribute.getName();
+        _builder.append(_name, "");
+        _builder.append("\", ");
+        StatemachineActionFieldConcatenation _source = ((StatemachineActionFieldSet)action).getSource();
+        StatemachineControlFieldAttribute _attribute_1 = ((StatemachineActionFieldSet)action).getAttribute();
+        StatemachineFieldType _attributeType = _attribute_1.getAttributeType();
+        StatemachineInternalType _attributeType_1 = _attributeType.getAttributeType();
+        String _literal = _attributeType_1.getLiteral();
+        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(_literal);
+        CharSequence _concatenation = this.concatenation(_source, _typeRef);
+        _builder.append(_concatenation, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldRemove) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.remove(\"");
+        StatemachineControlFieldAttribute _attribute = ((StatemachineActionFieldRemove)action).getAttribute();
+        String _name = _attribute.getName();
+        _builder.append(_name, "");
+        _builder.append("\", -1);");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldClear) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.clear(\"");
+        StatemachineControlFieldAttribute _attribute = ((StatemachineActionFieldClear)action).getAttribute();
+        String _name = _attribute.getName();
+        _builder.append(_name, "");
+        _builder.append("\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldKeystroke) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.append(\"");
+        StatemachineControlFieldAttribute _attribute = ((StatemachineActionFieldKeystroke)action).getAttribute();
+        String _name = _attribute.getName();
+        _builder.append(_name, "");
+        _builder.append("\", event.getId());");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionItemVisible) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.enable(\"");
+        StatemachineControlVisibility _attribute = ((StatemachineActionItemVisible)action).getAttribute();
+        String _name = _attribute.getName();
+        _builder.append(_name, "");
+        _builder.append("\", true);");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionItemInvisible) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.enable(\"");
+        StatemachineControlVisibility _attribute = ((StatemachineActionItemInvisible)action).getAttribute();
+        String _name = _attribute.getName();
+        _builder.append(_name, "");
+        _builder.append("\", false);");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionButtonCaption) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.caption(\"");
+        StatemachineControlButtonAttribute _attribute = ((StatemachineActionButtonCaption)action).getAttribute();
+        String _name = _attribute.getName();
+        _builder.append(_name, "");
+        _builder.append("\", \"");
+        StatemachineActionFieldConcatenation _caption = ((StatemachineActionButtonCaption)action).getCaption();
+        _builder.append(_caption, "");
+        _builder.append("\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionButtonImage) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.image(\"");
+        StatemachineControlButtonAttribute _attribute = ((StatemachineActionButtonImage)action).getAttribute();
+        String _name = _attribute.getName();
+        _builder.append(_name, "");
+        _builder.append("\", \"");
+        String _image = ((StatemachineActionButtonImage)action).getImage();
+        _builder.append(_image, "");
+        _builder.append("\");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionDTOFind) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.find(\"");
+        StatemachineControlDTOAttribute _dto = ((StatemachineActionDTOFind)action).getDto();
+        StatemachineDTOType _attributeType = _dto.getAttributeType();
+        LDto _attributeType_1 = _attributeType.getAttributeType();
+        String _name = _attributeType_1.getName();
+        _builder.append(_name, "");
+        _builder.append("\", \"");
+        LDtoInheritedAttribute _attribute = ((StatemachineActionDTOFind)action).getAttribute();
+        LAttribute _inheritedFeature = _attribute.getInheritedFeature();
+        String _name_1 = _inheritedFeature.getName();
+        _builder.append(_name_1, "");
+        _builder.append("\", ");
+        StatemachineActionFieldConcatenation _search = ((StatemachineActionDTOFind)action).getSearch();
+        CharSequence _concatenation = this.concatenation(_search);
+        _builder.append(_concatenation, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineStorage) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.putStorage(\"");
+        String _key = ((StatemachineStorage)action).getKey();
+        _builder.append(_key, "");
+        _builder.append("\",\"");
+        String _attribute = ((StatemachineStorage)action).getAttribute();
+        _builder.append(_attribute, "");
+        _builder.append("\", ");
+        StatemachineActionFieldConcatenation _content = ((StatemachineStorage)action).getContent();
+        CharSequence _concatenation = this.concatenation(_content);
+        _builder.append(_concatenation, "");
+        _builder.append(");");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionScheduler) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _identation = this.identation(level);
+        _builder.append(_identation, "");
+        _builder.append("stateMachine.set(\"");
+        StatemachineControlSchedulerAttribute _scheduler = ((StatemachineActionScheduler)action).getScheduler();
+        String _name = _scheduler.getName();
+        _builder.append(_name, "");
+        _builder.append("Scheduler\", ");
+        StatemachineControlSchedulerAttribute _scheduler_1 = ((StatemachineActionScheduler)action).getScheduler();
+        int _delay = _scheduler_1.getDelay();
+        _builder.append(_delay, "");
+        _builder.append("L);");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineOperation) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        String _decodeOperation = this.decodeOperation(((StatemachineOperation)action), level);
+        _builder.append(_decodeOperation, "");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionConditionalTransition) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        StatemachineGuard _guard = ((StatemachineActionConditionalTransition)action).getGuard();
+        CharSequence _decodeGuard = this.decodeGuard(_guard, level);
+        _builder.append(_decodeGuard, "");
+        _builder.newLineIfNotEmpty();
+        {
+          EList<StatemachineAction> _actions = ((StatemachineActionConditionalTransition)action).getActions();
+          for(final StatemachineAction act : _actions) {
+            Object _switchAction = this.switchAction(act, (level + 1));
+            _builder.append(_switchAction, "");
+            _builder.newLineIfNotEmpty();
+          }
+        }
+        String _identation = this.identation((level + 1));
+        _builder.append(_identation, "");
+        _builder.append("return ");
+        StatemachineState _transition = ((StatemachineActionConditionalTransition)action).getTransition();
+        String _name = _transition.getName();
+        _builder.append(_name, "");
+        _builder.append(";");
+        _builder.newLineIfNotEmpty();
+        String _identation_1 = this.identation(level);
+        _builder.append(_identation_1, "");
+        _builder.append("}");
+        return _builder.toString();
+      }
+    }
+    return null;
+  }
+  
+  public CharSequence concatenation(final StatemachineActionFieldConcatenation concatenation) {
+    return this.concatenation(concatenation, null);
+  }
+  
+  public CharSequence concatenation(final StatemachineActionFieldConcatenation concatenation, final JvmTypeReference cast) {
+    StringConcatenation _builder = new StringConcatenation();
+    StatemachineActionFieldSource _first = concatenation.getFirst();
+    String _concatenationDecode = this.concatenationDecode(_first, cast);
+    _builder.append(_concatenationDecode, "");
+    {
+      EList<StatemachineActionFieldSource> _more = concatenation.getMore();
+      for(final StatemachineActionFieldSource element : _more) {
+        _builder.append("+");
+        String _concatenationDecode_1 = this.concatenationDecode(element, cast);
+        _builder.append(_concatenationDecode_1, "");
+      }
+    }
+    return _builder;
+  }
+  
+  public String concatenationDecode(final StatemachineActionFieldSource action, final JvmTypeReference cast) {
+    boolean _matched = false;
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldSourceString) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        _builder.append("\"");
+        String _text = ((StatemachineActionFieldSourceString)action).getText();
+        _builder.append(_text, "");
+        _builder.append("\"");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldSourceNumber) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        Double _value = ((StatemachineActionFieldSourceNumber)action).getValue();
+        _builder.append(_value, "");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldSourceEvaluate) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        _builder.append("stateMachine.");
+        StatemachineEvaluationType _evaluationtype = ((StatemachineActionFieldSourceEvaluate)action).getEvaluationtype();
+        String _literal = _evaluationtype.getLiteral();
+        _builder.append(_literal, "");
+        _builder.append("()");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldSourceEvent) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        _builder.append("event.getId()");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldSourceTranslate) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        _builder.append("stateMachine.getTranslation(\"");
+        String _text = ((StatemachineActionFieldSourceTranslate)action).getText();
+        _builder.append(_text, "");
+        _builder.append("\")");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldGet) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        {
+          boolean _and = false;
+          boolean _and_1 = false;
+          boolean _notEquals = (!Objects.equal(cast, null));
+          if (!_notEquals) {
+            _and_1 = false;
+          } else {
+            String _simpleName = cast.getSimpleName();
+            StatemachineControlFieldAttribute _attribute = ((StatemachineActionFieldGet)action).getAttribute();
+            StatemachineFieldType _attributeType = _attribute.getAttributeType();
+            StatemachineInternalType _attributeType_1 = _attributeType.getAttributeType();
+            String _literal = _attributeType_1.getLiteral();
+            boolean _equals = _simpleName.equals(_literal);
+            boolean _not = (!_equals);
+            _and_1 = _not;
+          }
+          if (!_and_1) {
+            _and = false;
+          } else {
+            boolean _or = false;
+            StatemachineControlFieldAttribute _attribute_1 = ((StatemachineActionFieldGet)action).getAttribute();
+            StatemachineFieldType _attributeType_2 = _attribute_1.getAttributeType();
+            StatemachineInternalType _attributeType_3 = _attributeType_2.getAttributeType();
+            String _literal_1 = _attributeType_3.getLiteral();
+            boolean _equals_1 = _literal_1.equals("String");
+            if (_equals_1) {
+              _or = true;
+            } else {
+              StatemachineControlFieldAttribute _attribute_2 = ((StatemachineActionFieldGet)action).getAttribute();
+              StatemachineFieldType _attributeType_4 = _attribute_2.getAttributeType();
+              StatemachineInternalType _attributeType_5 = _attributeType_4.getAttributeType();
+              String _literal_2 = _attributeType_5.getLiteral();
+              boolean _equals_2 = _literal_2.equals("SuggestText");
+              _or = _equals_2;
+            }
+            _and = _or;
+          }
+          if (_and) {
+            String _simpleName_1 = cast.getSimpleName();
+            _builder.append(_simpleName_1, "");
+            _builder.append(".parse");
+            String _simpleName_2 = cast.getSimpleName();
+            _builder.append(_simpleName_2, "");
+            _builder.append("((String)");
+          }
+        }
+        _builder.append("stateMachine.get(\"");
+        StatemachineControlFieldAttribute _attribute_3 = ((StatemachineActionFieldGet)action).getAttribute();
+        String _name = _attribute_3.getName();
+        _builder.append(_name, "");
+        _builder.append("\")");
+        {
+          boolean _and_2 = false;
+          boolean _and_3 = false;
+          boolean _notEquals_1 = (!Objects.equal(cast, null));
+          if (!_notEquals_1) {
+            _and_3 = false;
+          } else {
+            String _simpleName_3 = cast.getSimpleName();
+            boolean _equals_3 = _simpleName_3.equals("String");
+            _and_3 = _equals_3;
+          }
+          if (!_and_3) {
+            _and_2 = false;
+          } else {
+            StatemachineControlFieldAttribute _attribute_4 = ((StatemachineActionFieldGet)action).getAttribute();
+            StatemachineFieldType _attributeType_6 = _attribute_4.getAttributeType();
+            StatemachineInternalType _attributeType_7 = _attributeType_6.getAttributeType();
+            String _literal_3 = _attributeType_7.getLiteral();
+            boolean _equals_4 = _literal_3.equals("String");
+            boolean _not_1 = (!_equals_4);
+            _and_2 = _not_1;
+          }
+          if (_and_2) {
+            _builder.append(".toString()");
+          }
+        }
+        {
+          boolean _and_4 = false;
+          boolean _and_5 = false;
+          boolean _notEquals_2 = (!Objects.equal(cast, null));
+          if (!_notEquals_2) {
+            _and_5 = false;
+          } else {
+            String _simpleName_4 = cast.getSimpleName();
+            StatemachineControlFieldAttribute _attribute_5 = ((StatemachineActionFieldGet)action).getAttribute();
+            StatemachineFieldType _attributeType_8 = _attribute_5.getAttributeType();
+            StatemachineInternalType _attributeType_9 = _attributeType_8.getAttributeType();
+            String _literal_4 = _attributeType_9.getLiteral();
+            boolean _equals_5 = _simpleName_4.equals(_literal_4);
+            boolean _not_2 = (!_equals_5);
+            _and_5 = _not_2;
+          }
+          if (!_and_5) {
+            _and_4 = false;
+          } else {
+            boolean _or_1 = false;
+            StatemachineControlFieldAttribute _attribute_6 = ((StatemachineActionFieldGet)action).getAttribute();
+            StatemachineFieldType _attributeType_10 = _attribute_6.getAttributeType();
+            StatemachineInternalType _attributeType_11 = _attributeType_10.getAttributeType();
+            String _literal_5 = _attributeType_11.getLiteral();
+            boolean _equals_6 = _literal_5.equals("String");
+            if (_equals_6) {
+              _or_1 = true;
+            } else {
+              StatemachineControlFieldAttribute _attribute_7 = ((StatemachineActionFieldGet)action).getAttribute();
+              StatemachineFieldType _attributeType_12 = _attribute_7.getAttributeType();
+              StatemachineInternalType _attributeType_13 = _attributeType_12.getAttributeType();
+              String _literal_6 = _attributeType_13.getLiteral();
+              boolean _equals_7 = _literal_6.equals("SuggestText");
+              _or_1 = _equals_7;
+            }
+            _and_4 = _or_1;
+          }
+          if (_and_4) {
+            _builder.append(")");
+          }
+        }
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineOperation) {
+        _matched=true;
+        return this.decodeOperation(((StatemachineOperation)action), 0);
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineFunction) {
+        _matched=true;
+        return this.decodeFunction(((StatemachineFunction)action), 0);
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineStorageRetrieve) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        {
+          boolean _notEquals = (!Objects.equal(cast, null));
+          if (_notEquals) {
+            _builder.append("(");
+            String _qualifiedName = cast.getQualifiedName();
+            _builder.append(_qualifiedName, "");
+            _builder.append(")");
+          }
+        }
+        _builder.append("stateMachine.getStorage(\"");
+        String _key = ((StatemachineStorageRetrieve)action).getKey();
+        _builder.append(_key, "");
+        _builder.append("\", \"");
+        String _attribute = ((StatemachineStorageRetrieve)action).getAttribute();
+        _builder.append(_attribute, "");
+        _builder.append("\")");
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionFieldSourceDtoAttribute) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        _builder.append("stateMachine.get(\"");
+        StatemachineControlDTOAttribute _dto = ((StatemachineActionFieldSourceDtoAttribute)action).getDto();
+        StatemachineDTOType _attributeType = _dto.getAttributeType();
+        LDto _attributeType_1 = _attributeType.getAttributeType();
+        String _name = _attributeType_1.getName();
+        _builder.append(_name, "");
+        LDtoInheritedAttribute _attribute = ((StatemachineActionFieldSourceDtoAttribute)action).getAttribute();
+        LAttribute _inheritedFeature = _attribute.getInheritedFeature();
+        String _name_1 = _inheritedFeature.getName();
+        String _firstUpper = StringExtensions.toFirstUpper(_name_1);
+        _builder.append(_firstUpper, "");
+        _builder.append("\")");
+        {
+          boolean _and = false;
+          boolean _notEquals = (!Objects.equal(cast, null));
+          if (!_notEquals) {
+            _and = false;
+          } else {
+            String _simpleName = cast.getSimpleName();
+            boolean _equals = _simpleName.equals("String");
+            _and = _equals;
+          }
+          if (_and) {
+            _builder.append(".toString()");
+          }
+        }
+        return _builder.toString();
+      }
+    }
+    if (!_matched) {
+      if (action instanceof StatemachineActionPeripheralPTResponse) {
+        _matched=true;
+        StringConcatenation _builder = new StringConcatenation();
+        _builder.append("stateMachine.get(\"PaymentTerminalResponse\")");
+        return _builder.toString();
+      }
+    }
+    return null;
+  }
+  
+  public String decodeOperation(final StatemachineOperation operation, final int level) {
+    return this.decodeOperation(operation, false, level);
+  }
+  
+  public String decodeOperation(final StatemachineOperation operation, final boolean isIdentity, final int level) {
+    StringConcatenation _builder = new StringConcatenation();
+    String _identation = this.identation(level);
+    _builder.append(_identation, "");
+    _builder.append("if(!((boolean)");
+    FunctionLibraryOperation _operation = operation.getOperation();
+    String _name = _operation.getName();
+    StatemachineOperationParameter _first = operation.getFirst();
+    EList<StatemachineOperationParameter> _more = operation.getMore();
+    String _call = this.call(((EObject) operation), _name, StatemachineEnums.Functions.OPERATION, _first, ((StatemachineOperationParameter[])Conversions.unwrapArray(_more, StatemachineOperationParameter.class)), isIdentity);
+    _builder.append(_call, "");
+    _builder.append(")) {");
+    _builder.newLineIfNotEmpty();
+    String _identation_1 = this.identation(level);
+    _builder.append(_identation_1, "");
+    _builder.append("\tNotification.show(\"Operation failed\", \"");
+    FunctionLibraryOperation _operation_1 = operation.getOperation();
+    String _name_1 = _operation_1.getName();
+    _builder.append(_name_1, "");
+    _builder.append("\", Type.ERROR_MESSAGE);");
+    _builder.newLineIfNotEmpty();
+    String _identation_2 = this.identation(level);
+    _builder.append(_identation_2, "");
+    _builder.append("\treturn this;\t");
+    _builder.newLineIfNotEmpty();
+    String _identation_3 = this.identation(level);
+    _builder.append(_identation_3, "");
+    _builder.append("}");
+    return _builder.toString();
+  }
+  
+  public String decodeFunction(final StatemachineFunction function, final int level) {
+    StringConcatenation _builder = new StringConcatenation();
+    String _identation = this.identation(level);
+    _builder.append(_identation, "");
+    FunctionLibraryFunction _function = function.getFunction();
+    String _name = _function.getName();
+    StatemachineOperationParameter _first = function.getFirst();
+    EList<StatemachineOperationParameter> _more = function.getMore();
+    String _call = this.call(((EObject) function), _name, StatemachineEnums.Functions.FUNCTION, _first, ((StatemachineOperationParameter[])Conversions.unwrapArray(_more, StatemachineOperationParameter.class)), false);
+    _builder.append(_call, "");
+    return _builder.toString();
+  }
+  
+  public String call(final EObject parent, final String name, final StatemachineEnums.Functions function, final StatemachineOperationParameter first, final StatemachineOperationParameter[] more, final boolean isIdentity) {
+    Statemachine statemachine = null;
+    EObject eObj = parent;
+    while ((!(eObj instanceof StatemachinePackage))) {
+      {
+        if ((eObj instanceof Statemachine)) {
+          statemachine = ((Statemachine) eObj);
+        }
+        EObject _eContainer = eObj.eContainer();
+        eObj = _eContainer;
+      }
+    }
+    if ((eObj instanceof StatemachinePackage)) {
+      if (function != null) {
+        switch (function) {
+          case GUARD:
+            StringConcatenation _builder = new StringConcatenation();
+            String _name = ((StatemachinePackage)eObj).getName();
+            String _plus = (_name + ".");
+            QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(eObj);
+            String _lastSegment = _fullyQualifiedName.getLastSegment();
+            String _firstUpper = StringExtensions.toFirstUpper(_lastSegment);
+            String _plus_1 = (_plus + _firstUpper);
+            _builder.append(_plus_1, "");
+            _builder.append(this.binderPostfix, "");
+            _builder.append(".getFunctionLibraryService().guard(stateMachine, \"");
+            FunctionLibraryStatemachineGroup _functionGroup = statemachine.getFunctionGroup();
+            QualifiedName _fullyQualifiedName_1 = this._iQualifiedNameProvider.getFullyQualifiedName(_functionGroup);
+            _builder.append(_fullyQualifiedName_1, "");
+            _builder.append("\", \"");
+            _builder.append(name, "");
+            _builder.append("\")");
+            return _builder.toString();
+          case OPERATION:
+            StringConcatenation _builder_1 = new StringConcatenation();
+            String _name_1 = ((StatemachinePackage)eObj).getName();
+            String _plus_2 = (_name_1 + ".");
+            QualifiedName _fullyQualifiedName_2 = this._iQualifiedNameProvider.getFullyQualifiedName(eObj);
+            String _lastSegment_1 = _fullyQualifiedName_2.getLastSegment();
+            String _firstUpper_1 = StringExtensions.toFirstUpper(_lastSegment_1);
+            String _plus_3 = (_plus_2 + _firstUpper_1);
+            _builder_1.append(_plus_3, "");
+            _builder_1.append(this.binderPostfix, "");
+            _builder_1.append(".getFunctionLibraryService().operation(stateMachine, \"");
+            FunctionLibraryStatemachineGroup _functionGroup_1 = statemachine.getFunctionGroup();
+            QualifiedName _fullyQualifiedName_3 = this._iQualifiedNameProvider.getFullyQualifiedName(_functionGroup_1);
+            _builder_1.append(_fullyQualifiedName_3, "");
+            _builder_1.append("\", ");
+            String _processParameters = this.processParameters(name, first, more, isIdentity);
+            _builder_1.append(_processParameters, "");
+            _builder_1.append(")");
+            return _builder_1.toString();
+          case FUNCTION:
+            StringConcatenation _builder_2 = new StringConcatenation();
+            String _name_2 = ((StatemachinePackage)eObj).getName();
+            String _plus_4 = (_name_2 + ".");
+            QualifiedName _fullyQualifiedName_4 = this._iQualifiedNameProvider.getFullyQualifiedName(eObj);
+            String _lastSegment_2 = _fullyQualifiedName_4.getLastSegment();
+            String _firstUpper_2 = StringExtensions.toFirstUpper(_lastSegment_2);
+            String _plus_5 = (_plus_4 + _firstUpper_2);
+            _builder_2.append(_plus_5, "");
+            _builder_2.append(this.binderPostfix, "");
+            _builder_2.append(".getFunctionLibraryService().function(stateMachine, \"");
+            FunctionLibraryStatemachineGroup _functionGroup_2 = statemachine.getFunctionGroup();
+            QualifiedName _fullyQualifiedName_5 = this._iQualifiedNameProvider.getFullyQualifiedName(_functionGroup_2);
+            _builder_2.append(_fullyQualifiedName_5, "");
+            _builder_2.append("\", ");
+            String _processParameters_1 = this.processParameters(name, first, more, isIdentity);
+            _builder_2.append(_processParameters_1, "");
+            _builder_2.append(")");
+            return _builder_2.toString();
+          default:
+            break;
+        }
+      }
+    } else {
+      StringConcatenation _builder_3 = new StringConcatenation();
+      _builder_3.append("/* error: parents not found */");
+      return _builder_3.toString();
+    }
+    return null;
+  }
+  
+  public String processParameters(final String name, final StatemachineOperationParameter first, final StatemachineOperationParameter[] more, final boolean isIdentity) {
+    boolean _equals = Objects.equal(first, null);
+    if (_equals) {
+      StringConcatenation _builder = new StringConcatenation();
+      _builder.append("\"");
+      _builder.append(name, "");
+      _builder.append("\"");
+      {
+        if (isIdentity) {
+          _builder.append(", event.getId()");
+        }
+      }
+      return _builder.toString();
+    }
+    StringConcatenation _builder_1 = new StringConcatenation();
+    _builder_1.append("\"");
+    _builder_1.append(name, "");
+    _builder_1.append("\", ");
+    {
+      if (isIdentity) {
+        _builder_1.append("event.getId(), ");
+      }
+    }
+    StatemachineActionFieldConcatenation _source = first.getSource();
+    CharSequence _concatenation = this.concatenation(_source);
+    _builder_1.append(_concatenation, "");
+    String body = _builder_1.toString();
+    boolean _notEquals = (!Objects.equal(more, null));
+    if (_notEquals) {
+      for (final StatemachineOperationParameter para : more) {
+        StringConcatenation _builder_2 = new StringConcatenation();
+        _builder_2.append(body, "");
+        _builder_2.append(", ");
+        StatemachineActionFieldConcatenation _source_1 = para.getSource();
+        CharSequence _concatenation_1 = this.concatenation(_source_1);
+        _builder_2.append(_concatenation_1, "");
+        body = _builder_2.toString();
+      }
+    }
+    return body;
+  }
+  
+  public void toBinderFields(final JvmDeclaredType type, final StatemachinePackage datamart) {
+    JvmField field = null;
+    JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(Logger.class);
+    final Procedure1<JvmField> _function = new Procedure1<JvmField>() {
+      public void apply(final JvmField it) {
+        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+          public void apply(final ITreeAppendable it) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("org.slf4j.LoggerFactory.getLogger(\"servicebinder\")");
+            it.append(_builder);
+          }
+        };
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
+      }
+    };
+    JvmField _field = this._jvmTypesBuilder.toField(datamart, "log", _typeRef, _function);
+    field = _field;
+    field.setStatic(true);
+    field.setVisibility(JvmVisibility.PRIVATE);
+    EList<JvmMember> _members = type.getMembers();
+    this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+    JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(IFunctionLibraryService.class);
+    JvmField _field_1 = this._jvmTypesBuilder.toField(datamart, "functionLibraryService", _typeRef_1);
+    field = _field_1;
+    field.setStatic(true);
+    field.setVisibility(JvmVisibility.PRIVATE);
+    EList<JvmMember> _members_1 = type.getMembers();
+    this._jvmTypesBuilder.<JvmField>operator_add(_members_1, field);
+  }
+  
+  public void toBinderOperations(final JvmDeclaredType type, final StatemachinePackage datamart) {
+    JvmOperation operation = null;
+    EList<JvmMember> _members = type.getMembers();
+    JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(IFunctionLibraryService.class);
+    final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
+      public void apply(final JvmOperation it) {
+        it.setVisibility(JvmVisibility.PUBLIC);
+        it.setStatic(true);
+        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+          public void apply(final ITreeAppendable it) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("return functionLibraryService;");
+            it.append(_builder);
+          }
+        };
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+      }
+    };
+    JvmOperation _method = this._jvmTypesBuilder.toMethod(datamart, "getFunctionLibraryService", _typeRef, _function);
+    this._jvmTypesBuilder.<JvmOperation>operator_add(_members, _method);
+    EList<JvmMember> _members_1 = type.getMembers();
+    JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(Void.TYPE);
+    final Procedure1<JvmOperation> _function_1 = new Procedure1<JvmOperation>() {
+      public void apply(final JvmOperation it) {
+        JvmAnnotationReference annotationRef = StatemachineDSLJvmModelInferrer.this._annotationTypesBuilder.annotationRef(Reference.class);
+        StatemachineDSLJvmModelInferrer.this._annotationExtension.addAnnAttr(annotationRef, datamart, "cardinality", ReferenceCardinality.MANDATORY);
+        StatemachineDSLJvmModelInferrer.this._annotationExtension.addAnnAttr(annotationRef, datamart, "policy", ReferencePolicy.STATIC);
+        EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
+        it.setVisibility(JvmVisibility.PUBLIC);
+        it.setSynchronized(true);
+        EList<JvmFormalParameter> _parameters = it.getParameters();
+        JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IFunctionLibraryService.class);
+        JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(datamart, "functionLibraryService", _typeRef);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+          public void apply(final ITreeAppendable it) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("this.functionLibraryService = functionLibraryService;");
+            _builder.newLine();
+            _builder.append("log.debug(\"Statemachine FunctionLibraryServiceService bound\");");
+            it.append(_builder);
+          }
+        };
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+      }
+    };
+    JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(datamart, "bindFunctionLibraryService", _typeRef_1, _function_1);
+    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, _method_1);
+    EList<JvmMember> _members_2 = type.getMembers();
+    JvmTypeReference _typeRef_2 = this._typeReferenceBuilder.typeRef(Void.TYPE);
+    final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
+      public void apply(final JvmOperation it) {
+        it.setVisibility(JvmVisibility.PUBLIC);
+        it.setSynchronized(true);
+        EList<JvmFormalParameter> _parameters = it.getParameters();
+        JvmTypeReference _typeRef = StatemachineDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IFunctionLibraryService.class);
+        JvmFormalParameter _parameter = StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(datamart, "functionLibraryService", _typeRef);
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+        final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
+          public void apply(final ITreeAppendable it) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("this.functionLibraryService = null;");
+            _builder.newLine();
+            _builder.append("log.debug(\"Statemachine FunctionLibraryServiceService unbound\");");
+            it.append(_builder);
+          }
+        };
+        StatemachineDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+      }
+    };
+    JvmOperation _method_2 = this._jvmTypesBuilder.toMethod(datamart, "unbindFunctionLibraryService", _typeRef_2, _function_2);
+    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method_2);
+  }
+  
+  public void infer(final EObject statemachinePkg, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
+    if (statemachinePkg instanceof StatemachinePackage) {
+      _infer((StatemachinePackage)statemachinePkg, acceptor, isPreIndexingPhase);
+      return;
+    } else if (statemachinePkg != null) {
+      _infer(statemachinePkg, acceptor, isPreIndexingPhase);
+      return;
+    } else {
+      throw new IllegalArgumentException("Unhandled parameter types: " +
+        Arrays.<Object>asList(statemachinePkg, acceptor, isPreIndexingPhase).toString());
+    }
+  }
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLModelGenerator.java b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLModelGenerator.java
new file mode 100644
index 0000000..191956e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLModelGenerator.java
@@ -0,0 +1,121 @@
+package org.eclipse.osbp.xtext.statemachine.jvmmodel;
+
+import com.google.common.base.Objects;
+import com.vaadin.ui.Notification;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import javax.inject.Inject;
+import jpos.LineDisplayConst;
+import jpos.POSPrinterConst;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.osbp.abstractstatemachine.AbstractStateMachine;
+import org.eclipse.osbp.abstractstatemachine.TaskEventSource;
+import org.eclipse.osbp.dsl.dto.lib.services.IDTOService;
+import org.eclipse.osbp.ecview.core.extension.model.extension.YSuggestTextFieldEvents;
+import org.eclipse.osbp.runtime.common.i18n.ITranslator;
+import org.eclipse.osbp.ui.api.message.MessageEvent;
+import org.eclipse.osbp.ui.api.statemachine.IStateMachine;
+import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
+import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils;
+import org.eclipse.osbp.xtext.i18n.I18NModelGenerator;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePackage;
+import org.eclipse.xtext.common.types.JvmAnnotationReference;
+import org.eclipse.xtext.common.types.JvmEnumerationLiteral;
+import org.eclipse.xtext.common.types.JvmTypeReference;
+import org.eclipse.xtext.generator.IFileSystemAccess;
+import org.eclipse.xtext.xbase.XExpression;
+import org.eclipse.xtext.xbase.compiler.GeneratorConfig;
+import org.eclipse.xtext.xbase.compiler.ImportManager;
+import org.eclipse.xtext.xbase.compiler.XbaseCompiler;
+import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
+import org.eclipse.xtext.xbase.compiler.output.TreeAppendable;
+import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
+import org.eclipse.xtext.xbase.jvmmodel.JvmModelAssociator;
+import org.eclipse.xtext.xbase.lib.Extension;
+import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
+import org.joda.time.DateTime;
+import org.osgi.service.useradmin.User;
+
+@SuppressWarnings("all")
+public class StatemachineDSLModelGenerator extends I18NModelGenerator {
+  @Inject
+  @Extension
+  private BasicDslGeneratorUtils _basicDslGeneratorUtils;
+  
+  @Inject
+  @Extension
+  private JvmModelAssociator _jvmModelAssociator;
+  
+  @Inject
+  private XbaseCompiler compiler;
+  
+  public static String pckgName = null;
+  
+  public void generatePckgName(final StatemachinePackage pckg, final IJvmDeclaredTypeAcceptor acceptor) {
+    String _name = pckg.getName();
+    StatemachineDSLModelGenerator.pckgName = _name;
+  }
+  
+  public void doGenerate(final Resource input, final IFileSystemAccess fsa) {
+    super.doGenerate(input, fsa);
+  }
+  
+  public TreeAppendable createAppendable(final EObject context, final ImportManager importManager, final GeneratorConfig config) {
+    TreeAppendable _xblockexpression = null;
+    {
+      Resource _eResource = context.eResource();
+      this.setBuilder(_eResource);
+      this._basicDslGeneratorUtils.addImportFor(this, importManager, this._typeReferenceBuilder, User.class, ResourceBundle.class, Locale.class, List.class, ITranslator.class, AbstractStateMachine.class, IStateMachine.class, MessageEvent.class, MessageEvent.EventType.class, TaskEventSource.class, LineDisplayConst.class, POSPrinterConst.class, IThemeResourceService.ThemeResourceType.class, YSuggestTextFieldEvents.class, DateTime.class, Notification.class, Notification.Type.class, IDTOService.class);
+      _xblockexpression = super.createAppendable(context, importManager, config);
+    }
+    return _xblockexpression;
+  }
+  
+  public void generateInitialization(final JvmEnumerationLiteral it, final ITreeAppendable appendable, final GeneratorConfig config) {
+    Procedure1<? super ITreeAppendable> _compilationStrategy = this._jvmTypeExtensions.getCompilationStrategy(it);
+    boolean _notEquals = (!Objects.equal(_compilationStrategy, null));
+    if (_notEquals) {
+      appendable.append(" { ");
+      appendable.increaseIndentation();
+      appendable.newLine();
+      Procedure1<? super ITreeAppendable> _compilationStrategy_1 = this._jvmTypeExtensions.getCompilationStrategy(it);
+      _compilationStrategy_1.apply(appendable);
+      appendable.decreaseIndentation();
+      appendable.newLine();
+      appendable.append("}");
+    } else {
+      final XExpression expression = this._jvmModelAssociator.getAssociatedExpression(it);
+      boolean _and = false;
+      boolean _notEquals_1 = (!Objects.equal(expression, null));
+      if (!_notEquals_1) {
+        _and = false;
+      } else {
+        boolean _isGenerateExpressions = config.isGenerateExpressions();
+        _and = _isGenerateExpressions;
+      }
+      if (_and) {
+        boolean _hasErrors = this._errorSafeExtensions.hasErrors(expression);
+        if (_hasErrors) {
+          appendable.append(" /* Skipped initializer because of errors */");
+        } else {
+          appendable.append(" = ");
+          JvmTypeReference _type = it.getType();
+          this.compiler.compileAsJavaExpression(expression, appendable, _type);
+        }
+      }
+    }
+  }
+  
+  public void generateEnumLiteral(final JvmEnumerationLiteral it, final ITreeAppendable appendable, final GeneratorConfig config) {
+    appendable.newLine();
+    this.generateJavaDoc(it, appendable, config);
+    EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+    this.generateAnnotations(_annotations, appendable, true, config);
+    String _simpleName = it.getSimpleName();
+    appendable.append(_simpleName);
+    this.generateInitialization(it, appendable, config);
+  }
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/scoping/.StatemachineDSLScopeProvider.java._trace b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/scoping/.StatemachineDSLScopeProvider.java._trace
new file mode 100644
index 0000000..c05bf8c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/scoping/.StatemachineDSLScopeProvider.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/scoping/StatemachineDSLScopeProvider.java b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/scoping/StatemachineDSLScopeProvider.java
new file mode 100644
index 0000000..0dbe56d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/scoping/StatemachineDSLScopeProvider.java
@@ -0,0 +1,832 @@
+/**
+ * Copyright (c) 2013, 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.statemachine.scoping;
+
+import com.google.common.base.Objects;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.osbp.dsl.semantic.common.types.LAttribute;
+import org.eclipse.osbp.dsl.semantic.common.types.LFeature;
+import org.eclipse.osbp.dsl.semantic.dto.LDto;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
+import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryFunction;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryGuard;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryOperation;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryParameter;
+import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryStatemachineGroup;
+import org.eclipse.osbp.xtext.statemachine.Statemachine;
+import org.eclipse.osbp.xtext.statemachine.StatemachineAction;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionDTOFind;
+import org.eclipse.osbp.xtext.statemachine.StatemachineActionFieldSourceDtoAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControl;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButton;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlButtonAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTO;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlDTOAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlField;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlFieldLayout;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlPeripheral;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlScheduler;
+import org.eclipse.osbp.xtext.statemachine.StatemachineControlSchedulerAttribute;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineDTOType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineEnums;
+import org.eclipse.osbp.xtext.statemachine.StatemachineFieldType;
+import org.eclipse.osbp.xtext.statemachine.StatemachineInternalType;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceCashDrawer;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDeviceLineDisplay;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePOSPrinter;
+import org.eclipse.osbp.xtext.statemachine.StatemachinePeripheralDevicePT;
+import org.eclipse.osbp.xtext.statemachine.StatemachineState;
+import org.eclipse.osbp.xtext.statemachine.StatemachineStorage;
+import org.eclipse.osbp.xtext.statemachine.StatemachineTrigger;
+import org.eclipse.xtext.common.types.JvmTypeReference;
+import org.eclipse.xtext.resource.EObjectDescription;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.scoping.IScope;
+import org.eclipse.xtext.scoping.impl.MapBasedScope;
+import org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsBatchScopeProvider;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+@SuppressWarnings("all")
+public class StatemachineDSLScopeProvider extends XbaseWithAnnotationsBatchScopeProvider {
+  public IScope getScope(final EObject context, final EReference reference) {
+    IScope _switchResult = null;
+    boolean _matched = false;
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_CONDITIONAL_TRANSITION__GUARD)) {
+        _matched=true;
+        return this.getFunctionService(context, StatemachineEnums.Functions.GUARD);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_OPERATION__OPERATION)) {
+        _matched=true;
+        return this.getFunctionService(context, StatemachineEnums.Functions.OPERATION);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_GUARD__GUARD)) {
+        _matched=true;
+        return this.getFunctionService(context, StatemachineEnums.Functions.GUARD);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_FUNCTION__FUNCTION)) {
+        _matched=true;
+        return this.getFunctionService(context, StatemachineEnums.Functions.FUNCTION);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_STATE__IDENTITY)) {
+        _matched=true;
+        return this.getFunctionService(context, StatemachineEnums.Functions.OPERATION);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_STATE__KEYSTROKE)) {
+        _matched=true;
+        return this.getStringFields(context);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_STATE__KEY_OPERATION)) {
+        _matched=true;
+        return this.getFunctionService(context, StatemachineEnums.Functions.OPERATION);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_BLINK_RATE__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CLEAR__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CREATE_WINDOW__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_CURSOR_TYPE__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DESTROY_WINDOW__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_BITMAP__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_DISPLAY_TEXT_AT__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_FORMAT__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_TYPE__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_SCROLL__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.LINEDISPLAY);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_OPEN_DRAWER__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.CASHDRAWER);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BARCODE__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.POSPRINTER);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_BITMAP__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.POSPRINTER);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_CUT__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.POSPRINTER);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_NORMAL__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.POSPRINTER);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.POSPRINTER);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_OPEN__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_CLOSE__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_ACKNOWLEDGE__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REGISTRATION__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_AUTHORIZATION__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_REVERSAL__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PT_RESPONSE__DEVICE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.PAYMENTTERMINAL);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_CAPTION__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.BUTTON);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_BUTTON_IMAGE__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.BUTTON);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_GET__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.FIELD);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_CLEAR__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.FIELD);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_KEYSTROKE__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.FIELD);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SET__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.FIELD);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_REMOVE__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.FIELD);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_VISIBLE__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.ITEM);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_ITEM_INVISIBLE__ATTRIBUTE)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.ITEM);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__DTO)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.DTO);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_DTO_FIND__ATTRIBUTE)) {
+        _matched=true;
+        return this.getFindDTOAttributes(context);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__DTO)) {
+        _matched=true;
+        return this.getDTO(context);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE__ATTRIBUTE)) {
+        _matched=true;
+        return this.getDTOAttributes(context);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_SCHEDULER__SCHEDULER)) {
+        _matched=true;
+        return this.getActions(context, StatemachineEnums.Controls.SCHEDULER);
+      }
+    }
+    if (!_matched) {
+      if (Objects.equal(reference, StatemachineDSLPackage.Literals.STATEMACHINE_ACTION_PERIPHERAL_PRINT_REPORT__KEY)) {
+        _matched=true;
+        return this.getStorageKey(context, StatemachineEnums.StorageAccess.KEY);
+      }
+    }
+    if (!_matched) {
+      _switchResult = super.getScope(context, reference);
+    }
+    return _switchResult;
+  }
+  
+  public IScope getStorageKey(final EObject context, final StatemachineEnums.StorageAccess access) {
+    final ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
+    EObject statemachine = context;
+    while (((!Objects.equal(statemachine, null)) && (!(statemachine instanceof Statemachine)))) {
+      EObject _eContainer = statemachine.eContainer();
+      statemachine = _eContainer;
+    }
+    boolean _and = false;
+    boolean _notEquals = (!Objects.equal(statemachine, null));
+    if (!_notEquals) {
+      _and = false;
+    } else {
+      _and = (statemachine instanceof Statemachine);
+    }
+    if (_and) {
+      EList<StatemachineState> _states = ((Statemachine) statemachine).getStates();
+      final Consumer<StatemachineState> _function = new Consumer<StatemachineState>() {
+        public void accept(final StatemachineState it) {
+          EList<StatemachineTrigger> _triggers = it.getTriggers();
+          final Consumer<StatemachineTrigger> _function = new Consumer<StatemachineTrigger>() {
+            public void accept(final StatemachineTrigger it) {
+              EList<StatemachineAction> _actions = it.getActions();
+              final Consumer<StatemachineAction> _function = new Consumer<StatemachineAction>() {
+                public void accept(final StatemachineAction it) {
+                  if ((it instanceof StatemachineStorage)) {
+                    if (access != null) {
+                      switch (access) {
+                        case KEY:
+                          String _key = ((StatemachineStorage)it).getKey();
+                          IEObjectDescription _create = EObjectDescription.create(_key, it);
+                          result.add(_create);
+                          break;
+                        case ATTRIBUTE:
+                          String _attribute = ((StatemachineStorage)it).getAttribute();
+                          IEObjectDescription _create_1 = EObjectDescription.create(_attribute, it);
+                          result.add(_create_1);
+                          break;
+                        default:
+                          break;
+                      }
+                    }
+                  }
+                }
+              };
+              _actions.forEach(_function);
+            }
+          };
+          _triggers.forEach(_function);
+        }
+      };
+      _states.forEach(_function);
+    }
+    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
+  }
+  
+  public IScope getStringFields(final EObject context) {
+    ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
+    EObject statemachine = ((EObject) context);
+    while (((!Objects.equal(statemachine, null)) && (!(statemachine instanceof Statemachine)))) {
+      EObject _eContainer = statemachine.eContainer();
+      statemachine = _eContainer;
+    }
+    boolean _and = false;
+    boolean _and_1 = false;
+    boolean _notEquals = (!Objects.equal(statemachine, null));
+    if (!_notEquals) {
+      _and_1 = false;
+    } else {
+      _and_1 = (statemachine instanceof Statemachine);
+    }
+    if (!_and_1) {
+      _and = false;
+    } else {
+      EList<StatemachineControl> _controls = ((Statemachine) statemachine).getControls();
+      boolean _notEquals_1 = (!Objects.equal(_controls, null));
+      _and = _notEquals_1;
+    }
+    if (_and) {
+      EList<StatemachineControl> _controls_1 = ((Statemachine) statemachine).getControls();
+      for (final StatemachineControl control : _controls_1) {
+        if ((control instanceof StatemachineControlField)) {
+          EList<StatemachineControlFieldAttribute> _fields = ((StatemachineControlField) control).getFields();
+          for (final StatemachineControlFieldAttribute field : _fields) {
+            boolean _or = false;
+            StatemachineFieldType _attributeType = field.getAttributeType();
+            StatemachineInternalType _attributeType_1 = _attributeType.getAttributeType();
+            boolean _equals = Objects.equal(_attributeType_1, StatemachineInternalType.STRING);
+            if (_equals) {
+              _or = true;
+            } else {
+              StatemachineFieldType _attributeType_2 = field.getAttributeType();
+              StatemachineInternalType _attributeType_3 = _attributeType_2.getAttributeType();
+              boolean _equals_1 = Objects.equal(_attributeType_3, StatemachineInternalType.SUGGESTTEXT);
+              _or = _equals_1;
+            }
+            if (_or) {
+              String _name = field.getName();
+              IEObjectDescription _create = EObjectDescription.create(_name, field);
+              result.add(_create);
+            }
+          }
+        }
+      }
+    }
+    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
+  }
+  
+  public IScope getDTOAttributes(final EObject context) {
+    StatemachineActionFieldSourceDtoAttribute dtoFind = ((StatemachineActionFieldSourceDtoAttribute) context);
+    StatemachineControlDTOAttribute _dto = dtoFind.getDto();
+    StatemachineDTOType _attributeType = _dto.getAttributeType();
+    LDto _attributeType_1 = _attributeType.getAttributeType();
+    LDto dto = ((LDto) _attributeType_1);
+    return this.scopeDTOAttributes(dto, context);
+  }
+  
+  public IScope getDTO(final EObject context) {
+    ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
+    EObject statemachine = ((EObject) context);
+    while (((!Objects.equal(statemachine, null)) && (!(statemachine instanceof Statemachine)))) {
+      EObject _eContainer = statemachine.eContainer();
+      statemachine = _eContainer;
+    }
+    boolean _and = false;
+    boolean _and_1 = false;
+    boolean _notEquals = (!Objects.equal(statemachine, null));
+    if (!_notEquals) {
+      _and_1 = false;
+    } else {
+      _and_1 = (statemachine instanceof Statemachine);
+    }
+    if (!_and_1) {
+      _and = false;
+    } else {
+      EList<StatemachineControl> _controls = ((Statemachine) statemachine).getControls();
+      boolean _notEquals_1 = (!Objects.equal(_controls, null));
+      _and = _notEquals_1;
+    }
+    if (_and) {
+      EList<StatemachineControl> _controls_1 = ((Statemachine) statemachine).getControls();
+      for (final StatemachineControl control : _controls_1) {
+        if ((control instanceof StatemachineControlDTO)) {
+          EList<StatemachineControlDTOAttribute> _dtos = ((StatemachineControlDTO)control).getDtos();
+          for (final StatemachineControlDTOAttribute dto : _dtos) {
+            String _name = dto.getName();
+            IEObjectDescription _create = EObjectDescription.create(_name, dto);
+            result.add(_create);
+          }
+        }
+      }
+    }
+    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
+  }
+  
+  public IScope getFindDTOAttributes(final EObject context) {
+    StatemachineActionDTOFind dtoFind = ((StatemachineActionDTOFind) context);
+    StatemachineControlDTOAttribute _dto = dtoFind.getDto();
+    StatemachineDTOType _attributeType = _dto.getAttributeType();
+    LDto _attributeType_1 = _attributeType.getAttributeType();
+    LDto dto = ((LDto) _attributeType_1);
+    return this.scopeDTOAttributes(dto, context);
+  }
+  
+  public IScope scopeDTOAttributes(final LDto dto, final EObject context) {
+    ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
+    boolean _notEquals = (!Objects.equal(dto, null));
+    if (_notEquals) {
+      List<? extends LFeature> _allFeatures = dto.getAllFeatures();
+      for (final LFeature f : _allFeatures) {
+        if ((f instanceof LDtoInheritedAttribute)) {
+          LEntityAttribute attr = null;
+          LAttribute _inheritedFeature = ((LDtoInheritedAttribute)f).getInheritedFeature();
+          boolean _eIsProxy = _inheritedFeature.eIsProxy();
+          if (_eIsProxy) {
+            LAttribute _inheritedFeature_1 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+            final URI uri = ((InternalEObject) _inheritedFeature_1).eProxyURI();
+            Resource _eResource = context.eResource();
+            ResourceSet _resourceSet = _eResource.getResourceSet();
+            EObject _eObject = _resourceSet.getEObject(uri, true);
+            attr = ((LEntityAttribute) _eObject);
+          } else {
+            LAttribute _inheritedFeature_2 = ((LDtoInheritedAttribute)f).getInheritedFeature();
+            attr = ((LEntityAttribute) _inheritedFeature_2);
+          }
+          String _name = attr.getName();
+          IEObjectDescription _create = EObjectDescription.create(_name, ((LDtoInheritedAttribute) f));
+          result.add(_create);
+        }
+      }
+    }
+    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
+  }
+  
+  public IScope getActions(final EObject context, final StatemachineEnums.Controls controlType) {
+    ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
+    EObject statemachine = ((EObject) context);
+    while (((!Objects.equal(statemachine, null)) && (!(statemachine instanceof Statemachine)))) {
+      EObject _eContainer = statemachine.eContainer();
+      statemachine = _eContainer;
+    }
+    boolean _and = false;
+    boolean _and_1 = false;
+    boolean _notEquals = (!Objects.equal(statemachine, null));
+    if (!_notEquals) {
+      _and_1 = false;
+    } else {
+      _and_1 = (statemachine instanceof Statemachine);
+    }
+    if (!_and_1) {
+      _and = false;
+    } else {
+      EList<StatemachineControl> _controls = ((Statemachine) statemachine).getControls();
+      boolean _notEquals_1 = (!Objects.equal(_controls, null));
+      _and = _notEquals_1;
+    }
+    if (_and) {
+      EList<StatemachineControl> _controls_1 = ((Statemachine) statemachine).getControls();
+      for (final StatemachineControl control : _controls_1) {
+        {
+          boolean _and_2 = false;
+          boolean _equals = Objects.equal(controlType, StatemachineEnums.Controls.BUTTON);
+          if (!_equals) {
+            _and_2 = false;
+          } else {
+            _and_2 = (control instanceof StatemachineControlButton);
+          }
+          if (_and_2) {
+            EList<StatemachineControlButtonAttribute> _buttons = ((StatemachineControlButton) control).getButtons();
+            for (final StatemachineControlButtonAttribute button : _buttons) {
+              String _name = button.getName();
+              IEObjectDescription _create = EObjectDescription.create(_name, button);
+              result.add(_create);
+            }
+          }
+          boolean _and_3 = false;
+          boolean _equals_1 = Objects.equal(controlType, StatemachineEnums.Controls.SCHEDULER);
+          if (!_equals_1) {
+            _and_3 = false;
+          } else {
+            _and_3 = (control instanceof StatemachineControlScheduler);
+          }
+          if (_and_3) {
+            EList<StatemachineControlSchedulerAttribute> _schedulers = ((StatemachineControlScheduler) control).getSchedulers();
+            for (final StatemachineControlSchedulerAttribute scheduler : _schedulers) {
+              String _name_1 = scheduler.getName();
+              IEObjectDescription _create_1 = EObjectDescription.create(_name_1, scheduler);
+              result.add(_create_1);
+            }
+          }
+          boolean _and_4 = false;
+          boolean _equals_2 = Objects.equal(controlType, StatemachineEnums.Controls.FIELD);
+          if (!_equals_2) {
+            _and_4 = false;
+          } else {
+            _and_4 = (control instanceof StatemachineControlField);
+          }
+          if (_and_4) {
+            EList<StatemachineControlFieldAttribute> _fields = ((StatemachineControlField) control).getFields();
+            for (final StatemachineControlFieldAttribute field : _fields) {
+              String _name_2 = field.getName();
+              IEObjectDescription _create_2 = EObjectDescription.create(_name_2, field);
+              result.add(_create_2);
+            }
+          }
+          boolean _and_5 = false;
+          boolean _equals_3 = Objects.equal(controlType, StatemachineEnums.Controls.ITEM);
+          if (!_equals_3) {
+            _and_5 = false;
+          } else {
+            _and_5 = ((control instanceof StatemachineControlButton) || (control instanceof StatemachineControlField));
+          }
+          if (_and_5) {
+            if ((control instanceof StatemachineControlButton)) {
+              EList<StatemachineControlButtonAttribute> _buttons_1 = ((StatemachineControlButton) control).getButtons();
+              for (final StatemachineControlButtonAttribute button_1 : _buttons_1) {
+                String _name_3 = button_1.getName();
+                IEObjectDescription _create_3 = EObjectDescription.create(_name_3, button_1);
+                result.add(_create_3);
+              }
+              String _name_4 = ((StatemachineControlButton)control).getName();
+              IEObjectDescription _create_4 = EObjectDescription.create(_name_4, control);
+              result.add(_create_4);
+            }
+            if ((control instanceof StatemachineControlField)) {
+              EList<StatemachineControlFieldAttribute> _fields_1 = ((StatemachineControlField) control).getFields();
+              for (final StatemachineControlFieldAttribute field_1 : _fields_1) {
+                String _name_5 = field_1.getName();
+                IEObjectDescription _create_5 = EObjectDescription.create(_name_5, field_1);
+                result.add(_create_5);
+              }
+              EList<StatemachineControlFieldLayout> _layouts = ((StatemachineControlField) control).getLayouts();
+              for (final StatemachineControlFieldLayout layout : _layouts) {
+                String _name_6 = layout.getName();
+                IEObjectDescription _create_6 = EObjectDescription.create(_name_6, layout);
+                result.add(_create_6);
+              }
+            }
+          }
+          boolean _and_6 = false;
+          boolean _equals_4 = Objects.equal(controlType, StatemachineEnums.Controls.DTO);
+          if (!_equals_4) {
+            _and_6 = false;
+          } else {
+            _and_6 = (control instanceof StatemachineControlDTO);
+          }
+          if (_and_6) {
+            EList<StatemachineControlDTOAttribute> _dtos = ((StatemachineControlDTO) control).getDtos();
+            for (final StatemachineControlDTOAttribute dto : _dtos) {
+              String _name_7 = dto.getName();
+              IEObjectDescription _create_7 = EObjectDescription.create(_name_7, dto);
+              result.add(_create_7);
+            }
+          }
+          boolean _and_7 = false;
+          boolean _equals_5 = Objects.equal(controlType, StatemachineEnums.Controls.LINEDISPLAY);
+          if (!_equals_5) {
+            _and_7 = false;
+          } else {
+            _and_7 = (control instanceof StatemachineControlPeripheral);
+          }
+          if (_and_7) {
+            EList<StatemachinePeripheralDeviceLineDisplay> _lineDisplays = ((StatemachineControlPeripheral) control).getLineDisplays();
+            for (final StatemachinePeripheralDeviceLineDisplay element : _lineDisplays) {
+              String _name_8 = element.getName();
+              IEObjectDescription _create_8 = EObjectDescription.create(_name_8, element);
+              result.add(_create_8);
+            }
+          }
+          boolean _and_8 = false;
+          boolean _equals_6 = Objects.equal(controlType, StatemachineEnums.Controls.POSPRINTER);
+          if (!_equals_6) {
+            _and_8 = false;
+          } else {
+            _and_8 = (control instanceof StatemachineControlPeripheral);
+          }
+          if (_and_8) {
+            EList<StatemachinePeripheralDevicePOSPrinter> _posPrinters = ((StatemachineControlPeripheral) control).getPosPrinters();
+            for (final StatemachinePeripheralDevicePOSPrinter element_1 : _posPrinters) {
+              String _name_9 = element_1.getName();
+              IEObjectDescription _create_9 = EObjectDescription.create(_name_9, element_1);
+              result.add(_create_9);
+            }
+          }
+          boolean _and_9 = false;
+          boolean _equals_7 = Objects.equal(controlType, StatemachineEnums.Controls.CASHDRAWER);
+          if (!_equals_7) {
+            _and_9 = false;
+          } else {
+            _and_9 = (control instanceof StatemachineControlPeripheral);
+          }
+          if (_and_9) {
+            EList<StatemachinePeripheralDeviceCashDrawer> _cashDrawers = ((StatemachineControlPeripheral) control).getCashDrawers();
+            for (final StatemachinePeripheralDeviceCashDrawer element_2 : _cashDrawers) {
+              String _name_10 = element_2.getName();
+              IEObjectDescription _create_10 = EObjectDescription.create(_name_10, element_2);
+              result.add(_create_10);
+            }
+          }
+          boolean _and_10 = false;
+          boolean _equals_8 = Objects.equal(controlType, StatemachineEnums.Controls.PAYMENTTERMINAL);
+          if (!_equals_8) {
+            _and_10 = false;
+          } else {
+            _and_10 = (control instanceof StatemachineControlPeripheral);
+          }
+          if (_and_10) {
+            EList<StatemachinePeripheralDevicePT> _paymentTerminals = ((StatemachineControlPeripheral) control).getPaymentTerminals();
+            for (final StatemachinePeripheralDevicePT element_3 : _paymentTerminals) {
+              String _name_11 = element_3.getName();
+              IEObjectDescription _create_11 = EObjectDescription.create(_name_11, element_3);
+              result.add(_create_11);
+            }
+          }
+        }
+      }
+    }
+    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
+  }
+  
+  public IScope getFunctionService(final EObject context, final StatemachineEnums.Functions function) {
+    ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
+    EObject statemachine = ((EObject) context);
+    while (((!Objects.equal(statemachine, null)) && (!(statemachine instanceof Statemachine)))) {
+      EObject _eContainer = statemachine.eContainer();
+      statemachine = _eContainer;
+    }
+    boolean _and = false;
+    boolean _and_1 = false;
+    boolean _notEquals = (!Objects.equal(statemachine, null));
+    if (!_notEquals) {
+      _and_1 = false;
+    } else {
+      _and_1 = (statemachine instanceof Statemachine);
+    }
+    if (!_and_1) {
+      _and = false;
+    } else {
+      FunctionLibraryStatemachineGroup _functionGroup = ((Statemachine) statemachine).getFunctionGroup();
+      boolean _notEquals_1 = (!Objects.equal(_functionGroup, null));
+      _and = _notEquals_1;
+    }
+    if (_and) {
+      if (function != null) {
+        switch (function) {
+          case GUARD:
+            FunctionLibraryStatemachineGroup _functionGroup_1 = ((Statemachine) statemachine).getFunctionGroup();
+            EList<FunctionLibraryGuard> _guards = _functionGroup_1.getGuards();
+            for (final FunctionLibraryGuard element : _guards) {
+              String _name = element.getName();
+              IEObjectDescription _create = EObjectDescription.create(_name, ((FunctionLibraryGuard) element));
+              result.add(_create);
+            }
+            break;
+          case OPERATION:
+            FunctionLibraryStatemachineGroup _functionGroup_2 = ((Statemachine) statemachine).getFunctionGroup();
+            EList<FunctionLibraryOperation> _operations = _functionGroup_2.getOperations();
+            for (final FunctionLibraryOperation element_1 : _operations) {
+              String _name_1 = element_1.getName();
+              IEObjectDescription _create_1 = EObjectDescription.create(_name_1, ((FunctionLibraryOperation) element_1));
+              result.add(_create_1);
+            }
+            break;
+          case FUNCTION:
+            FunctionLibraryStatemachineGroup _functionGroup_3 = ((Statemachine) statemachine).getFunctionGroup();
+            EList<FunctionLibraryFunction> _functions = _functionGroup_3.getFunctions();
+            for (final FunctionLibraryFunction element_2 : _functions) {
+              EList<FunctionLibraryParameter> _params = element_2.getParams();
+              int _size = _params.size();
+              boolean _greaterThan = (_size > 0);
+              if (_greaterThan) {
+                EList<FunctionLibraryParameter> _params_1 = element_2.getParams();
+                FunctionLibraryParameter _get = _params_1.get(0);
+                FunctionLibraryParameter first = ((FunctionLibraryParameter) _get);
+                JvmTypeReference _parameterType = first.getParameterType();
+                String _simpleName = _parameterType.getSimpleName();
+                boolean _equals = "IStateMachine".equals(_simpleName);
+                if (_equals) {
+                  String _name_2 = element_2.getName();
+                  IEObjectDescription _create_2 = EObjectDescription.create(_name_2, ((FunctionLibraryFunction) element_2));
+                  result.add(_create_2);
+                }
+              }
+            }
+            break;
+          default:
+            break;
+        }
+      }
+    }
+    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
+  }
+}
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/validation/.StatemachineDSLValidator.java._trace b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/validation/.StatemachineDSLValidator.java._trace
new file mode 100644
index 0000000..53a90c5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/validation/.StatemachineDSLValidator.java._trace
Binary files differ
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/validation/StatemachineDSLValidator.java b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/validation/StatemachineDSLValidator.java
new file mode 100644
index 0000000..c5d5604
--- /dev/null
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/validation/StatemachineDSLValidator.java
@@ -0,0 +1,15 @@
+/**
+ * generated by Xtext
+ */
+package org.eclipse.osbp.xtext.statemachine.validation;
+
+import org.eclipse.osbp.xtext.statemachine.validation.AbstractStatemachineDSLValidator;
+
+/**
+ * Custom validation rules.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#validation
+ */
+@SuppressWarnings("all")
+public class StatemachineDSLValidator extends AbstractStatemachineDSLValidator {
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..7b74c3d
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,110 @@
+<?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:
+# 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.releng.maven</groupId>
+        <artifactId>org.eclipse.osbp.releng.maven.parent.tycho</artifactId>
+        <version>0.9.0-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.eclipse.osbp.xtext.statemachine</groupId>
+    <artifactId>org.eclipse.osbp.xtext.statemachine.aggregator</artifactId>
+    <version>0.9.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <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.statemachine</module>
+        <module>org.eclipse.osbp.xtext.statemachine.ui</module>
+        <module>org.eclipse.osbp.xtext.statemachine.tests</module>
+        <module>org.eclipse.osbp.xtext.statemachine.feature</module>
+    </modules>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <configuration>
+                        <skip>true</skip>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.eclipse.tycho</groupId>
+                    <artifactId>target-platform-configuration</artifactId>
+                    <version>${tycho-version}</version>
+                    <configuration>
+                        <filters>
+                            <filter>
+                                <type>eclipse-plugin</type>
+                                <id>org.apache.aries.transaction.manager</id>
+                                <restrictTo>
+                                    <!--  use a range that does not exist, we can not mix removeall and versionRange -->
+                                    <versionRange>[0.5.0,0.5.1)</versionRange>
+                                </restrictTo>
+                            </filter>
+                        </filters>
+                        <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>
+    </build>
+</project>
